Autor Zpráva
Tori
Profil
Pěkný večer. Z DB tahám data nějakých akcí, jejich účastníků a jestli zaplatili účastnický poplatek. Každá akce má 1-M účastníků, každý účastník může k jedné akci odeslat 0-M plateb (záloha, doplatek, ...), data se seskupují podle ID akce. Potřebuju podle určité logiky zobrazovat buď datum splatnosti nebo "OK" (podle toho, jestli všichni účastníci zaplatili), momentálně to řeším v aplikaci, ale bylo by potřeba podle toho i řadit (např. nejdřív všechny, kde je "OK", pak ty s datumem splatnosti vzestupně).
Jak by to šlo porovnávat ještě v dotaze? (je to view, takže žádná subquery, jedině připojit jiný view)
Kajman
Profil
Nejsem si jistý, jestli z view už padají zgroupovaná data a jestli se může view upravit. Tak jen obecně.

Počet účastníků, kteří provedli alespoň jednu platbu lze zjistit z count(distinct platby.id_ucastnika).

Pokud zaplatili všichni účastníci přesnou částku, měla by se suma plateb rovnat počtu účastníků x cena akce pro jednoho.
Tori
Profil
Přesné částky radši ani neřeším, tak je nějaké voodoo, jak se počítají. Stačí, že je neprázdné datum zaplacení a typ platby = "záloha" (jestli byly zaplacené zálohy a jestli byly zaplacené doplatky jsou dva různé sloupce ve výsledku).
View upravovat můžu, data jsou grupovaná, řazení musí být podle názvu sloupce (nemůžu použít podmínky v order by, SQL generuje grid).

Konkrétně ta část view vypadá zhruba takhle:
select ... count(if(podmínka1, 1, null)) as celkem_nezrusenych_ucastniku,
count(if(podmínka1 ANd podmínka2, 1, null)) as celkem_ucastniku_se_zaplacenou_zalohou
a potřebovala bych něco na způsob
IF(celkem_nezrusenych_ucastniku = celkem_ucastniku_se_zaplacenou_zalohou, "OK", min(datumSplatnostiZalohy)) as zaloha

Nakonec jsem na to přišla - počítání účastníků + seskupení podle ID akce hodím do samostatného view, a v hlavním view pak můžu dělat tohle porovnání. Vypadá to, že se to o moc nezpomalilo, výrazněji to zpomalují ta porovnávání v count+if, asi špatně nastavené indexy nebo co.
Kajman
Profil
Tori:
a potřebovala bych něco na způsob

Šlo by to tak, že obalíš ten view (může to být též uloženo jako view).

select ... celkem_nezrusenych_ucastniku, celkem_ucastniku_se_zaplacenou_zalohou,
IF(celkem_nezrusenych_ucastniku = celkem_ucastniku_se_zaplacenou_zalohou, "OK", min(datumSplatnostiZalohy)) as zaloha
from hlavni_view

Případně to samé přímo v hlavním view
select ... from
(select puvodni ... ) t

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0