count(*), jak pokazać wiersze bez wartości przy grupowaniu
MaciejZal@gmail.com - 13-11-2006 00:43
count(*), jak pokazać wiersze bez wartości przy grupowaniu
Witam:
Mam sobie tablicę: tablica (id INTEGER PRIMARY KEY, kiedy DATE) Chciałbym dostać zestawienie pokazujące ilość wierszy z każdego dnia w zadanym przedziale
Robiąc to w ten sposób:
SELECT kiedy, COUNT(*) FROM tablica WHERE kiedy <= :data_konc AND kiedy >= :data_pocz GROUP BY kiedy
dostanę wynik tylko dla tych dni z przedziału, które mają niezerową liczbę wierszy w tablica. Tymczasem chciałbym dostać w wyniku po jednym wierszu dla każdego dnia z przedziału czasowego (z wartościa 0, jeśli nie ma nic w tablicy z tą datą).
Jedyne co mi przychodzi do głowy to wygenerować dodatkową pomocniczą tablicę zawierającą wszystkie możliwe dni i później z niej korzystać, ale po pierwsze zadane przedziały w zapytaniu będą różne a po drugie chciałbym w miarę możliwości uniknąć kursorów i pętli i ograniczyć się do czystego SQL. Ktoś ma jakąś sugestię?
Pozdrawiam Maciej.
Jacek - 13-11-2006 00:43
[ciach]
> ograniczyć się do czystego SQL.
_Przeczytać wątek_ na tej grupie, w którym wypowiadałeś się kilka godzin temu ;-)
-- Pozdrawiam, Jacek
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
MaciejZal@gmail.com - 13-11-2006 00:43
Jacek wrote:
> _Przeczytać wątek_ na tej grupie, w którym wypowiadałeś się kilka godzin temu > ;-) > Hehe, w sumie racja.
To zapytanie, które tam zaproponowałeś ładnie wygląda ale niestety u mnie nie za bardzo chce zadziałać (mssql2005):
GROUP BY, HAVING, or aggregate functions are not allowed in the recursive part of a recursive common table expression 'seqtab'.
Jacek - 13-11-2006 00:43
> To zapytanie, które tam zaproponowałeś ładnie wygląda ale niestety > u mnie nie za bardzo chce zadziałać (mssql2005): > > GROUP BY, HAVING, or aggregate functions are not allowed in the > recursive part of a recursive common table expression 'seqtab'.
Jakieś dziwne komunikaty, bo w _tamtym_ zapytaniu żadnego GROUP BY nie ma :-)
To jest "generator sekwencji" i jak googlnąłem to w MS 2005 są zapytania rekurencyjne i z pewnymi niuansami (dodawanie dat,...) powinno działać ?
with sek (dni) as ( values (select min(kiedy) from tab) union all select dni + 1 days from sek where dni < (select max(kiedy) from tab) ) select dni from sek
No, a jak to działa, to dalej można kombinować chociażby tak:
with sek (dni) as ( values (select min(kiedy) from tab) union all select dni + 1 days from sek where dni < (select max(kiedy) from tab) ) select dni, coalesce(a.cnt,0) from sek left join (select count(*) as cnt from tab group by kiedy) a on dni = kiedy
A jak nie działa, to mundra i często sportykana odpowiedź brzmiałaby mniej więcej tak: Pytanie: Piszę w asemblerze i nie wiem jak zrobić... Odpowiedź: Postaw dżejbosa i orakla na suse z rajdem i dalej już pójdzie...
;-)
-- Pozdrawiam, Jacek
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Jacek - 13-11-2006 00:43
> > To zapytanie, które tam zaproponowałeś ładnie wygląda ale niestety > > u mnie nie za bardzo chce zadziałać (mssql2005): > > > > GROUP BY, HAVING, or aggregate functions are not allowed in the > > recursive part of a recursive common table expression 'seqtab'. > > Jakieś dziwne komunikaty, bo w _tamtym_ zapytaniu żadnego GROUP BY nie ma :-)
Ściągnąłem (dzielny jestem?), sprawdziłem i przyznaję Ci rację :-)
> To jest "generator sekwencji" i jak googlnąłem to w MS 2005 są zapytania > rekurencyjne i z pewnymi niuansami (dodawanie dat,...) powinno działać ? > > with sek (dni) as > ( * * * values (select min(kiedy) from tab) > * * * *union all > * * * *select dni + 1 days from sek > * * * * * * * *where dni < (select max(kiedy) from tab) > ) > select dni > from sek
Tu powyżej jest nadmiarowe słówko "values", ale be z niego na MS SQL 2005 też nie idzie. Natomiast idzie coś takiego (generowanie ciągłej sekwencji z sekwencji dziurawej, bądź dolnego i górnego ograniczenia. ):
with sek(dni) as ( (select top 1 kiedy from tab order by kiedy) union all select dateadd(day, 1, dni) from sek where dni < any (select kiedy from tab) ) select * from sek
trochę przekombinowane, ale inaczej nie udało mi się obejść tych MS ograniczeń. Pewnie wyważam już dawno otwarte drzwi, ale może się komuś przyda.
-- Pozdrawiam, Jacek
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
MaciejZal@gmail.com - 13-11-2006 00:43
Jacek napisał(a):
> with sek(dni) > as > ( > (select top 1 kiedy from tab order by kiedy) > union all > select dateadd(day, 1, dni) from sek > where dni < any (select kiedy from tab) > ) > select * > from sek > > trochę przekombinowane, ale inaczej nie udało mi się obejść tych MS ograniczeń. > Pewnie wyważam już dawno otwarte drzwi, ale może się komuś przyda.
Podziwiam za dociekliwość. :) Ja już się poddałem wczoraj i stwierdziłem że zrobię to już w Data access layer, tzn. pobiorę tylko niezerowe z bazy, a resztę uzupełnię sobie datasourca pozostałymi zerowymi w pętli...
Pozdrawiam, Maciej
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Skopiowanie =?ISO-8859-2?Q?warto=B6ci_z_jednego_po?==?ISO-8859-2?Q?la_do_drugiego_w_jednej_tabeli=2C_r=F3=BFne_?= =?ISO-8859-2?Q?wiersze=2E?=
SELECT COUNT(*) FROM (SELECT `tablename` FROM `tablelist` WHERE `id` = 1)
mysql+php - =?ISO-8859-2?Q?wydajno=B6=E6_przy_olbrzymiej_i?==?ISO-8859-2?Q?lo=B6ci_rekord=F3w?=
[pgsql] 7.4 =?ISO-8859-2?Q?og=B3upia=B3_przy_zak=B3adaniu_?==?ISO-8859-2?Q?indeksu?=
[MySQL] Czy =?ISO-8859-2?Q?m=F3g=B3by_mi_kto=B6_pom=F3c_?==?ISO-8859-2?Q?przy_tym_zapytaniu_=3F?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
[mysql] =?ISO-8859-2?Q?po=B3=B1czenie_tabel_wg_kolumn=2C_?==?ISO-8859-2?Q?nie_wierszy?=
=?ISO-8859-2?Q?=5BOracle=5D_Porownanie_wierszy_z_tych_?==?ISO-8859-2?Q?samych_tablic_na_2_r=F3=BFnych_schematach?=
Zwracanie wartości, z funkcji, w funkcji [Js, Ajax]
Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ]
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|