SQL SQL-Abfrage mit 2 Summenwenn-Funktionen

Excelmania

Lieutenant
Registriert
Apr. 2010
Beiträge
794
Hallo.

ich habe eine Abfrage erstellt mit der ich Eingänge für Störmeldungen auswerten kann. Es gibt zwei Eingangsarten. Anstelle pro Tag zwei Einträge unterienander zu haben, würde ich gerne die jeweilie Anzahl in einer eigenen Spalte ausgeben. Leider klappt es jedoch nicht. Kann mir jemand weiterhelfen?

SQL:
select date(ts.startdatum), o.source, count(oi.quantity) as "Anzahl E-Mail", count(oi.quantity) as "Anzahl Webinterface"
from stoermeldungen_arten_view t
inner join stoermeldungen_view ts
on ts.stoermeldung_id = t.id

inner join order_items_view oi
on oi.orderable_id = ts.id
and oi.orderable_type = "Stoermeldung CAFM"

inner join orders_view o
on oi.order_id = o.id

group by date(ts.startdatum), o.source
 
Klappt nicht ist keine gute Beschreibung...

Ich sehe in deiner Query auch überhaupt keine Summe als Funktionsaufruf, passt dein Threadtitel? Oder wo ist dein Versuch mit Summe?

Dummy Daten und erwartetes Ergebnis wären am besten. Du musst immer bedenken, nur du kennst dein Datenbankschema, alle hier müssen anhand von der SQL Query und den Joins dann das Schema ableiten oder erraten.

Also, willst du jetzt 2 Zeilen zusammenfügen per Window Funktion? Oder kannst du es anhand von Beispieldaten etwas ausformulieren?
 
  • Gefällt mir
Reaktionen: Iqra, TheChief79 und Maviapril2
Das sind ja 2 verschiedene Abfragen, die du nebeneinander darstellen möchtest. Grundsätzlich keine gute Idee, aber da dur nur die Anzahl haben möchtest, mag das wohl gehen. Schau dir mal UNION an. Damit kann man das machen.
 
Das ist doch nur das Query, in der GUI kannst du das ja anders darstellen.

WingX schrieb:
Schau dir mal UNION an.
Da kommen ja trotzdem 2 Rows raus^^

WingX schrieb:
Das sind ja 2 verschiedene Abfragen
Nein es ist eine.
Bsp:
count(*) & group by source
Mail | 5
Web | 10

Und in der GUI macht man dann:
DateMailWeb
01.01.1970510

Sicher könnte man da auch irgendwie mit Queries was zusammen frickeln. Aber ob das sinnvoll ist, steht auf nem anderen Blatt.
 
Zuletzt bearbeitet:
count macht genau das, es zählt, nämlich die Zeilen wo für count(column) der Wert in column nicht NULL ist und für count(*) alle.

Count(quantity) sollte ein red flag sein, daß da nicht das rauskommt was gesucht ist:

idquantity
15
22
3NULL
Count(quantity) ist jetzt 2 für SELECT COUNT(quantity) FROM <table-name>, nicht 7 (sum) und auch nicht 3 (count(*)).

SQL kennt auch kein SUMMEWENN, auch wenn man sowas natürlich mit CASE implementieren kann.

Protip, wenn es um numerische Werte geht die aber NULL sein können, und sie sollen zB mit SUM aggregiert werden:

SQL:
SELECT key, SUM(coalesce(quantity, 0)) summewenn FROM table GROUP BY key
liefert mit einer gewissen Wahrscheinlichkeit ein zuverlässigeres Ergebnis als SUM(quantity).

Ob man jetzt zwei Abfragen macht und das in der Anwendung zusammensetzt oder ob man das in der Abfrage selber zusammensetzt ist egal. Das S in SQL steht für Structured. Das wird sehr gerne vergessen.

So in etwa ginge es strukturiert:
SQL:
SELECT SUM(c.quantity) FROM
(
  SELECT SUM (COALESCE(a.column_A, 0 ) quantity FROM table_A a -- mit oder ohne GROUP BY
    UNION ALL
  SELECT SUM(COALESCE(b.column_B, 0 ) FROM table_B b. -- auch hier mit oder ohne GROUP BY
) c

Was da passiert überlasse ich der eigenen Recherche.

Einkürzen kann man das sicherlich auch, aber das kommt sehr stark drauf an exakt wie die Daten strukturiert sind und ob einem eine Kombination mehrerer Aggregate in eine Abfrage wirklich das gibt, was man wollte -- kann sein, ist aber definitiv nicht notwendigerweise der Fall.
 
Zurück
Oben