none
2 SQL-Abfrage mit Union Bauen RRS feed

  • 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

    Donnerstag, 19. September 2019 11:17

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
    Donnerstag, 19. September 2019 12:18

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

    Donnerstag, 19. September 2019 11:31
  • 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

    Donnerstag, 19. September 2019 11:44
  • ich habe die Spalte RestGroesse noch nicht verknüpft, ich frage mich, wie ich das machen kann?

    Danke


    maness

    Donnerstag, 19. September 2019 11:46
  • Die INNER JOIN in beide Abfrage sind fast gleich nur die where bedingungen unterschiedet sich.

    Vielleicht kann man das in eine machen. Aber wie?

    Danke


    maness

    Donnerstag, 19. September 2019 11:49
  • 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]


    Donnerstag, 19. September 2019 12:03
  • Ok .

    Danke. 

    wie kann ich die Spalte Restgroesse ist der Abfrage einfügen?

    RestGroesse = spalte GesamtdateiGrosse - Spalte GesamtdateiGrossefertig

    Danke


    maness

    Donnerstag, 19. September 2019 12:12
  • 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
    Donnerstag, 19. September 2019 12:18
  • Ok

    Dankeschön

    Viele Grüße


    maness

    Donnerstag, 19. September 2019 12:33