COUNT
am 09.08.2006 01:03:31 von Andreas
Hi,
ich finde derzeitig keine Loesung fuer nachfolgende Abfrage:
Tabellenstruktur:
kunden_nr | artikel_nr | status
Ich moechte mir nun fuer einen waehlbaren Kunden die Anzahl der Artikel
anzeigen lassen, die einen bestimmten status haben. Fuer den Status habe ich
einen einfachen int Wert gewaehlt und er kann einen Wert von 0 bis 4
annehmen.
Mit
SELECT artikel, status, COUNT(status) AS `count_status` FROM tbl WHERE
(status = 0 OR status = 1) AND kunden_nr = ? GROUP by artikel_nr, status;
bekomme ich zwar alles, jedoch in 2 Zeilen geliefert, ich bekomme hier
einfach keine Abfrage mit Gruppierung hin, in der ich beides in einer Zeile
ausgegeben bekomme.
Wie bekomme ich das alles in einer Zeile ausgegeben?
Re: COUNT
am 09.08.2006 08:31:11 von Fabian Schladitz
Andreas schrieb:
> Hi,
>
> ich finde derzeitig keine Loesung fuer nachfolgende Abfrage:
>
> Tabellenstruktur:
> kunden_nr | artikel_nr | status
>
> Ich moechte mir nun fuer einen waehlbaren Kunden die Anzahl der Artikel
> anzeigen lassen, die einen bestimmten status haben. Fuer den Status habe ich
> einen einfachen int Wert gewaehlt und er kann einen Wert von 0 bis 4
> annehmen.
>
> Mit
> SELECT artikel, status, COUNT(status) AS `count_status` FROM tbl WHERE
> (status = 0 OR status = 1) AND kunden_nr = ? GROUP by artikel_nr, status;
>
> bekomme ich zwar alles, jedoch in 2 Zeilen geliefert, ich bekomme hier
> einfach keine Abfrage mit Gruppierung hin, in der ich beides in einer Zeile
> ausgegeben bekomme.
>
> Wie bekomme ich das alles in einer Zeile ausgegeben?
Wie soll das denn bitte aussehen, wenn du den Status mit in den SELECT-
und den GROUP-BY-Teil nimmst?
Wenn dir den Status egal ist, mach einfach nur:
SELECT artikel, COUNT(*) AS count_status FROM tbl WHERE status IN (0,1)
AND kunden_nr = ? GROUP BY artikel_nr;
Wenn du was anderes willst, stell das Ziel noch mal klar.
--
HTH,
Fabian
Re: COUNT
am 09.08.2006 10:15:17 von Andreas
> > Wie bekomme ich das alles in einer Zeile ausgegeben?
>
> Wie soll das denn bitte aussehen, wenn du den Status mit in den SELECT-
> und den GROUP-BY-Teil nimmst?
>
> Wenn dir den Status egal ist, mach einfach nur:
> SELECT artikel, COUNT(*) AS count_status FROM tbl WHERE status IN (0,1)
> AND kunden_nr = ? GROUP BY artikel_nr;
>
> Wenn du was anderes willst, stell das Ziel noch mal klar.
>
Ich bekam mit meiner Abfrage eine Zeile ausgegeben fuer den Status 0 und
eine fuer den Status 1, was auch ok ist, da ich die Anzahl von beidem
brauche. Was ich gern gehabt haette und nun habe ist, das ich beides in
einer Zeile ausgegeben bekomme, also wie oft Status 0 und wie oft Status 1.
Mittlerweile ist mir aufgefallen, das ich fuer mein Problem schon einmal
eine Loesung gefunden hatte, da mich wirklich nur der Status 0 oder 1
interessiert, ich jedoch alle 5 Status Moeglichkeiten bei der
Loesungsfindung im Kopf hatte und daher nicht darauf gekommen bin das hier
anzuwenden.
SELECT artikel_nr, SUM(status) AS status_a, (COUNT(status)- SUM(status)) AS
status_b FROM tbl WHERE status IN (0,1) AND kunden_nr = ? GROUP BY
artikel_nr;
PS: Wer eine bessere Loesung hat, die nehm ich auch gerne :)
Re: COUNT
am 09.08.2006 10:34:26 von Christian Kirsch
Andreas schrieb:
>
> SELECT artikel_nr, SUM(status) AS status_a, (COUNT(status)- SUM(status)) AS
> status_b FROM tbl WHERE status IN (0,1) AND kunden_nr = ? GROUP BY
> artikel_nr;
>
> PS: Wer eine bessere Loesung hat, die nehm ich auch gerne :)
>
>
select artikel_nr, sum(status) as status_1, sum(1-status) as status_0
from bla where status < 2 ...
Keine Ahnung, ob das "besser" ist.
Re: COUNT
am 09.08.2006 10:43:12 von t-kuehn
Moin,
> > > Wie bekomme ich das alles in einer Zeile ausgegeben?
> PS: Wer eine bessere Loesung hat, die nehm ich auch gerne :)
Vielleicht diese:
SELECT tbl0.artikel, Count(tbl0.status) AS status0, count(tbl1.Status)
AS status1
FROM tbl tbl0 INNER JOIN tbl tbl1 ON tbl0.artikel = tbl1.artikel and
tbl0.kunden_nr = tbl1.kunden_nr
WHERE tbl1.status=0 AND tbl1.status=1 AND tbl0.kunden_nr = ?
GROUP BY tbl0.artikel;
Re: COUNT
am 09.08.2006 10:48:51 von t-kuehn
oder so:
SELECT artikel, sum(case when status = 0 then 1 else 0 end) AS status0,
sum(case when status = 1 then 1 else 0 end) AS status1
FROM tbl
WHERE status in(0,1) and kunden_nr = ?
GROUP BY tbl0.artikel;
Re: COUNT
am 09.08.2006 11:12:49 von Andreas
schrieb im Newsbeitrag
news:1155113331.625309.66230@75g2000cwc.googlegroups.com...
> oder so:
>
> SELECT artikel, sum(case when status = 0 then 1 else 0 end) AS status0,
>
> sum(case when status = 1 then 1 else 0 end) AS status1
> FROM tbl
> WHERE status in(0,1) and kunden_nr = ?
> GROUP BY tbl0.artikel;
>
Danke - ich glaube diese Loesung werde ich favorisieren - die ist im
Bedarfsfall recht einfach zu erweitern.
Re: COUNT
am 09.08.2006 11:22:34 von Christian Kirsch
Andreas schrieb:
> schrieb im Newsbeitrag
> news:1155113331.625309.66230@75g2000cwc.googlegroups.com...
>> oder so:
>>
>> SELECT artikel, sum(case when status = 0 then 1 else 0 end) AS status0,
>>
>> sum(case when status = 1 then 1 else 0 end) AS status1
>> FROM tbl
>> WHERE status in(0,1) and kunden_nr = ?
>> GROUP BY tbl0.artikel;
>>
> Danke - ich glaube diese Loesung werde ich favorisieren - die ist im
> Bedarfsfall recht einfach zu erweitern.
>
>
Mich würde interessieren, ob es einen Unterschied zwischen "status in
(0,1)" und "status < 2" gibt - was sagt EXPLAIN dazu?
Re: COUNT
am 09.08.2006 15:09:15 von t-kuehn
> >
> Mich würde interessieren, ob es einen Unterschied zwischen "status in
> (0,1)" und "status < 2" gibt - was sagt EXPLAIN dazu?
Das Ergebnis wäre in diesem Falle wohl das Gleiche. Da aber der
Status in einer gschlossenen Menge (0,1,2,3) liegt, finde ich den
Ansatz
in (0,1) sinnvoller. Könnte ja auch (0, 2) sein.
Keine Ahnung, was in diesem Falle performanter wäre.
Kann da jemand Aussage zu machen?
status in (0,1)
status<2
status=3D0 or status=3D1
Re: COUNT
am 09.08.2006 15:21:12 von Thomas Rachel
t-kuehn@web.de wrote:
>> Mich würde interessieren, ob es einen Unterschied zwischen "status in
>> (0,1)" und "status < 2" gibt - was sagt EXPLAIN dazu?
>
> Das Ergebnis wäre in diesem Falle wohl das Gleiche.
Aber nicht zwingend gemäà EXPLAIN, und dessen Auskunft hängt mit der
Performance zusammen.
> Keine Ahnung, was in diesem Falle performanter wäre.
> Kann da jemand Aussage zu machen?
Ja. EXPLAIN.
> status in (0,1)
> status<2
> status=0 or status=1
status BETWEEN 0 AND 1
Thomas
--
Sind wir nicht alle ein bisschen Bielefeld? (Jörg Wagner in dcsm)