ďťż
 
count(*), jak pokazać wiersze bez wartości przy grupowaniu ďťż
 
count(*), jak pokazać wiersze bez wartości przy grupowaniu
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • wawa19wwa91.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com