Benutzer mit den meisten Antworten
2 SQL-Abfrage mit Union Bauen

Frage
-
Hallo Zusammen,
ich habe 2 SQL- Abfrage, ich möchte die beide in einer SQL-Abfrage machen und alle elemente von jede abfrage nur in eine Zeile bekommen.
hier die beide Abfragen.
unde.nummer AS kunde, SUM(datei.groesse) as "GesamtdateiGrosse",COUNT (DISTINCT objekt.id) as anzahlObjGesamt From datei INNER JOIN objekt ON datei.id_objekt = objekt.id INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id INNER JOIN kunde ON auftrag.id_kunde = kunde.id where kunde.nummer = 777 group by kunde.nummer union Select kunde.nummer AS kunde, SUM(datei.groesse) as "GesamtdateiGrossefertig",COUNT (DISTINCT objekt.id) as anzahlObjFertig From datei INNER JOIN objekt ON datei.id_objekt = objekt.id INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id INNER JOIN status ON objekt.id_restorestatus = status.id INNER JOIN kunde ON auftrag.id_kunde = kunde.id where status.name = 'fertig' and kunde.nummer = 777 group by kunde.nummer
ich möchte bei der Ergebnis 6 Spalte("kunde","GesamtdateiGrosse","anzahlObjGesamt","GesamtdateiGrossefertig","anzahlObjFertig" "RestGroesse") und 2 zeilen haben. RestGroesse wäre dann die Differenz zwischen GesamtdateiGrosse und GesamtdateiGrossefertig
Danke im Voraus für die Hilfe
LG
maness
Antworten
-
Am einfachsten eine weitere konditional Summe, nur mit Prüfung auf ungleich "fertig"
Select kunde.nummer AS kunde, SUM(CASE WHEN status.name = 'fertig' THEN datei.groesse ELSE 0.0 END) as GesamtdateiGrossefertig, SUM(CASE WHEN status.name <> 'fertig' THEN datei.groesse ELSE 0.0 END) as RestdateiGrossefertig, SUM(datei.groesse) as GesamtdateiGrosse, COUNT (DISTINCT CASE WHEN status.name = 'fertig' THEN objekt.id ELSE NULL END) as anzahlObjFertig, COUNT (DISTINCT objekt.id) as anzahlObjGesamt From datei INNER JOIN objekt ON datei.id_objekt = objekt.id INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id INNER JOIN status ON objekt.id_restorestatus = status.id INNER JOIN kunde ON auftrag.id_kunde = kunde.id where kunde.nummer = 777 group by kunde.nummer
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert maness Donnerstag, 19. September 2019 12:33
Alle Antworten
-
Hallo maness,
warum willst Du zwei Zeilen haben?
Kannst Du das mal mit Beispieldaten zeigen? Was steht dann bei der "ersten" Zeile für RestGroesse? Wobei die Reihenfolge ja nicht so einfach zu ermitteln ist. Da könntest Du dann evtl. einen konstanten Wert in einer weiteren Spalte zur Unterscheidung mitgeben.
Wie verknüpfst Du die beiden Teile? Über kunde.nummer? Dann wäre hier vielleicht eher ein LEFT JOIN angesagt und als Ergebnis nur eine Zeile pro Kunde.
Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu
-
Hallo,
danke für Ihre Antwort.
das war ein tippFehler, ich möchte doch nur eine zeile bekommen. jetzt mit der Code oben, ich bekomme 2 zeilen und 3 spalte (kunde, "GesamtdateiGrosse", "GesamtdateiGrosse").
was meinst du im Diesen Fall mit Left join? könntest du vielleicht ein beispiel senden
Danke
Lg
maness
-
Ein UNION brauchst Du hier nicht, ein einfaches konditionales Summieren/Zählen reicht:
Select kunde.nummer AS kunde, SUM(CASE WHEN status.name = 'fertig' THEN datei.groesse ELSE 0.0 END) as GesamtdateiGrossefertig, SUM(datei.groesse) as GesamtdateiGrosse, COUNT (DISTINCT CASE WHEN status.name = 'fertig' THEN objekt.id ELSE NULL END) as anzahlObjFertig, COUNT (DISTINCT objekt.id) as anzahlObjGesamt From datei INNER JOIN objekt ON datei.id_objekt = objekt.id INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id INNER JOIN status ON objekt.id_restorestatus = status.id INNER JOIN kunde ON auftrag.id_kunde = kunde.id where kunde.nummer = 777 group by kunde.nummer
Olaf Helper
[ Blog] [ Xing] [ MVP]- Bearbeitet Olaf HelperMVP Donnerstag, 19. September 2019 12:03
-
Am einfachsten eine weitere konditional Summe, nur mit Prüfung auf ungleich "fertig"
Select kunde.nummer AS kunde, SUM(CASE WHEN status.name = 'fertig' THEN datei.groesse ELSE 0.0 END) as GesamtdateiGrossefertig, SUM(CASE WHEN status.name <> 'fertig' THEN datei.groesse ELSE 0.0 END) as RestdateiGrossefertig, SUM(datei.groesse) as GesamtdateiGrosse, COUNT (DISTINCT CASE WHEN status.name = 'fertig' THEN objekt.id ELSE NULL END) as anzahlObjFertig, COUNT (DISTINCT objekt.id) as anzahlObjGesamt From datei INNER JOIN objekt ON datei.id_objekt = objekt.id INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id INNER JOIN status ON objekt.id_restorestatus = status.id INNER JOIN kunde ON auftrag.id_kunde = kunde.id where kunde.nummer = 777 group by kunde.nummer
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert maness Donnerstag, 19. September 2019 12:33