SQLite błędny count

0

Chciałem wykonać zapytanie które będzie sumować ceny usług z tabeli "userservices" JEŚLI wystąpią one w tabeli "scheduleevents".

SELECT userservices.service_name, sum(userservices.price)
FROM userservices
LEFT JOIN scheduleevents
ON scheduleevents.service_type_id = userservices.id
AND scheduleevents.is_start_time = 1 
AND scheduleevents.is_active = 0 
AND ( scheduleevents.DATE < DATE() 
     OR ( scheduleevents.DATE = DATE() 
     AND scheduleevents.TIME < TIME() ) )
GROUP BY userservices.service_name 

Po wykonaniu zapytania ładnie sumuje ceny usług, jeśli jakaś została wykonana np. 5 razy to ładnie pokazuje sumę jednak jest dziwny problem. Jeśli jakaś usługa nie została ani razu wykonana ( nie widnieje w tabeli scheduleevents) to zapytanie zamiast zwracać dla tych usług wartość 0, zwraca ich pojedynczy price tak jakby zostały raz wykonane.

1

Masz

....
userservices
LEFT JOIN scheduleevents
...

czyli userservices.price zawsze wystąpi minimum raz, nawet jeśli userservices nie będzie występował w scheduleevents.
W wyniku tego sum(userservices.price) daje ci pojedynczy price.

mógłbyś dodać np coś takiego zamiast sum(userservices.price):

sum(userservices.price)*(CASE WHEN count(PK z scheduleevents)=0 THEN 0 ELSE 1)
0

Dzięki za odpowiedź na pewno to przetestuję tylko po prostu ciekawi mnie to czemu wyskakuje ten jeden raz skoro i tak nie spełnia tych kolejnych warunków JOINA...

juro napisał(a):

Masz

CASE WHEN count(PK z scheduleevents)=0 THEN 0 ELSE 1)

Ten count ma zliczać scheduleevents.service_type_id?

0

Jeśłi łączysz left joinem z scheduleevents i masz 0 wystąpień danego usersevices w scheduleevents to w wyniku otrzymujesz 1 wiersz z usersevices i pustymi wartościami z scheduleevents, co daje pojedynczy price.
Warunki joina nic tutaj nie zmienią, jeśli dałbyś jakiś warunek w where na scheduleevents to odfiltrowałby ci te wiersze.

Count może zliczać tak jak podałeś scheduleevents.service_type_id i też powinno działać.

0

Działa wielkie dzięki tylko tutaj: CASE WHEN COUNT(PK z scheduleevents)=0 THEN 0 ELSE 1) przed zamknięciem nawiasu muszę dodać jeszcze "END".

1 użytkowników online, w tym zalogowanych: 0, gości: 1