josefsepp
Goto Top

SQL-Abfrage - 2 mal COUNT auf gleiche Spalte einer Tabelle.

Hallo,

Ich habe folgendes Problem.

Ich habe die Tabelle "Lieferscheine" in der Datenbank.

Nun soll herausgefunden welcher Lieferant, wie viele Lieferscheine hat.

Sinngemäß:

__________________

Select lieferant, count(*)

from lieferscheine

where lieferant in (1,2,3,4,5)

group by lieferant

___________________

Zugleich soll herausgefunden welche Lieferscheine bei den jeweiligen Lieferanten noch offen sind.

Sinngemäß:
______________________

Select lieferant, count(*)

from lieferscheine

where lieferant in (1,2,3,4,5)
and status = 1

group by lieferant

_______________________


Nun sollen die beiden Abfragen zusamengeführt werden, dass die Ausgabe so aussieht

Lieferant |LS_komplett |LS_offen
1 |2131 |1001
2 |1234 |700
3 |3429 |100
4 |21241 |5000


Gibt es eine Möglichkeit, dies zu realisieren?

Im Voraus schon mal besten Dank für Eure Hilfe.

mfg

JosefSepp

Content-ID: 170513

Url: https://administrator.de/contentid/170513

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

AndreasHoster
AndreasHoster 27.07.2011 um 14:17:00 Uhr
Goto Top
Die einfache Lösung wäre:
Die beiden Statements oben als View bauen und dann eine View, die die beiden über einen Join zusammennimmt.

Wenn man es als einzelnes Select Statement haben will, es sollte auch sowas gehen (ungetestet):
Select t1.Lieferant, t1.Komplett, t2.Offen
from
(Select lieferant, count(*) as komplett from lieferscheine where lieferant in (1,2,3,4,5) group by lieferant) as t1,
(Select lieferant, count(*) as offenfrom lieferscheine where lieferant in (1,2,3,4,5) and status=1 group by lieferant) as t2
where t1.Lieferant=t2.Lieferant
Im Moment werden damit nur Lieferanten gefunden, die auch offene Posten haben, muß man halt den Inner Join in ein Outer Join umwandeln, aber da weiß ich die Syntax gerade nicht auswendig.
dog
dog 27.07.2011 um 15:24:14 Uhr
Goto Top
Am einfachsten ist ein Subselect:

SELECT
  t.*,
  COUNT(*) AS Gesamt,
  (SELECT COUNT(*) FROM Lieferscheine t2 WHERE t2.Lieferant = t.Lieferant AND t2.Status = 1) AS Offen
FROM
  Lieferscheine t
WHERE
  t.Lieferant IN (1,2,3)
GROUP BY
  t.Lieferant
(ungetestet)
JosefSepp
JosefSepp 10.08.2011 um 09:19:20 Uhr
Goto Top
So bin gerade wieder aus dem Urlaub zurück und werde beide Varianten mal testen. Vielen Dank!