Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Abfrage aus 3 gleichen Tabellen - Gruppierung...

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Gargamel, 6 Juli 2015.

  1. Gargamel

    Gargamel Benutzer

    Hallo zusammen,

    ich bin gerade mit meinem "kleinen" Latein am Ende.
    Folgende Ausgangssituation besteht.

    Ich habe 3 Tabellen (Versand_Karton T0, Versand_Paletten T1, Versand_Sonder T2)
    Alle drei Tabellen besitzen zu 100 % den gleichen Aufbau.
    Nun möchte ich eigentlich aus jeder Tabelle die Versandart (gruppiert) und das Gewicht innerhalb eines angegebenen Datumsbereiches ausgegeben haben.

    Dabei steht in der Tabelle jeweils nur der Versandcode z.B. 2 geschrieben. Der Klartext steht wiederum in einer anderen Tabelle. Die muss ich ja mit einem INNER JOIN verknüpfen. Die Abfrage mit einer Tabelle habe ich ja hinbekommen.

    Da ich nun aber 3 Tabellen mit gleichen Werten verknüpfen muss, stehe ich etwas auf dem Schlauch.
    Habt ihr für mich einen heißen TIP ? Ich habe es auch schon mit einem UNION versucht. Da ich mich mit der UNION Abfrage nicht auskenne, bin ich auch daran gescheitert.

    So sieht z.B. mein vorhandenes Query aus.
    SELECT t1.[TrnspName], SUM(t0.u_gewicht_waage) FROM [dbo].[@VERSAND_SONDER] T0 INNER JOIN OSHP T1 ON T0.[U_Versandart] = T1.[TrnspCode] WHERE T0.[CreateDate] >=[%0] AND T0.[CreateDate] <=[%1] GROUP BY T1.[TrnspName]
     
    Zuletzt bearbeitet: 6 Juli 2015
  2. Distrilec

    Distrilec Datenbank-Guru

    Code:
    Select t1.value, t2.value, t3.value
    From table1 t1
    
    Inner Join table2 t2
    On t2.id = t1.id
    
    Inner Join table3 t3
    On t3.id = t2.id
    
    Where bla bla bla...
    Logisch war man ja schon auf dem richtigen Weg :)
     
  3. Gargamel

    Gargamel Benutzer

    Schon versucht, auch nicht das richtige. Oder das richtige aber nicht zu Ende gedacht...

    Ich möchte am Ende nicht drei Gewichte angezeigt bekommen, sondern möchte die Gewichte summiert je nach Versandart angezeigt haben.
    Beispiel... Wenn wir z.B. in der Tabelle 1 den GLS Versand mit 12 KG, in Tabelle 2 GLS mit 25 KG und in Tabelle 3 GLS mit 19 KG drin steht, möchte ich als Ausgabeergebnis GLS mit 56 KG sehen...
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das klingt schon massiv FAIL.

    Aber es geht so:

    Code:
    select ... from (select * from t0 union all select * from t1 union all select * from t3) bla ...
    
    Damit hast alles aus t0, t1 und t2 nun in einer (virtuellen) Tabelle bla.
     
  5. Gargamel

    Gargamel Benutzer

    Und womit verknüpfe ich dann die weitere Tabelle für die Versandart um den Klartextnamen zu erhalten ? Ich erhalte bei unten stehender Abfrage den Fehler INCORRECT SYNTAX NEAR THE KEYWORD 'INNER'.'

    SELECT t3.[TrnspName]
    FROM
    (
    SELECT * FROM [dbo].[@VERSAND_KARTON] T0
    UNION ALL
    SELECT * FROM [dbo].[@VERSAND_SONDER] T1
    UNION ALL
    SELECT * FROM [dbo].[@VERSAND_PALETTEN] T2
    )
    INNER JOIN OSHP T3 ON T0.[U_Versandart] = T3.[TrnspCode]
    WHERE T0.[CreateDate] >=[%0] AND T0.[CreateDate] <=[%1]
    GROUP BY T3.[TrnspName]​
     
  6. Distrilec

    Distrilec Datenbank-Guru

    Den Alias sollte man nicht vergessen.
    Code:
    SELECT t3.[TrnspName]
    FROM
    (
        SELECT * FROM [dbo].[@VERSAND_KARTON] T0
        UNION ALL
        SELECT * FROM [dbo].[@VERSAND_SONDER] T1
        UNION ALL
        SELECT * FROM [dbo].[@VERSAND_PALETTEN] T2
    ) t
    INNER JOIN OSHP T3 ON t.[U_Versandart] = T3.[TrnspCode]
    WHERE t.[CreateDate] >=[%0] AND t.[CreateDate] <=[%1]
    GROUP BY T3.[TrnspName]
    Warum man 3 Tabellen mit gleicher Struktur braucht, anstatt einfach eine Tabelle mit entsprechendem Informationsfeld ist mir zwar etwas schleierhaft.... Aber bitte :)
     
  7. Gargamel

    Gargamel Benutzer

    Wenn ich das wüsste :)
    Das hatten die Entwickler damals so umgesetzt... Ich fluche auch gerade darüber dass man sowas nicht in einer Tabelle hätte abbilden können. Von mir aus dann eben noch mit einer weiteren Hilfstabelle um eben die einzelnen Strecken abzubilden...
    Aber nun gut, man hat ja sonst keine Arbeit :D

    Aber ich habe jetzt ein anderes Problem...

    Die Abfrage steht soweit, vielen Dank. Habe Sie noch ein wenig modifiziert.
    PHP:
    SELECT T3.[TrnspName], SUM(T.[U_Gewicht_Waage])
    FROM
    (
        
    SELECT T0.[U_Gewicht_Waage], T0.[U_Versandart], T0.[CreateDateFROM [dbo].[@VERSAND_KARTONT0
        UNION
        SELECT T1
    .[U_Gewicht_Waage], T1.[U_Versandart], T1.[CreateDateFROM [dbo].[@VERSAND_SONDERT1
        UNION
        SELECT T2
    .[U_Gewicht_Waage], T2.[U_Versandart], T2.[CreateDateFROM [dbo].[@VERSAND_PALETTENT2
    T
    INNER JOIN OSHP T3 ON T
    .[U_Versandart] = T3.[TrnspCode]
    WHERE T.[CreateDate] >=[%0] AND T.[CreateDate] <=[%1]
    GROUP BY T3.[TrnspName]
    Anbei habe ich einen Screenshot gepackt wo die Problematik sichtbar wird.
    Ich habe jeweils eine einzelne Abfrage für die 3 Tabellen um die Gesamtgewichte zu kontrollieren. In den meisten Fällen passt es auch, bis auf drei Abweichungen die ich nicht erklären kann.

    2216142.jpg
    Habe ich noch irgendwo einen Denkfehler ?
     
    Zuletzt von einem Moderator bearbeitet: 6 Juli 2015
  8. Distrilec

    Distrilec Datenbank-Guru

    Es könnte sein das die Datensätze "doppelt" sind...
    Der Befehl "Union" verkettet Tabellenwerte einzigartig. Versuch mal "Union All". Vllt. ist das schon die Lösung.

    Wenn das nicht hilft bräuchte ich ein paar Beispieldaten / DDLs. Da könnte ich mehr testen :)

    (Vllt. die Spediteurnamen retuschieren... Muss ja keiner wissen ;) )
     
  9. Gargamel

    Gargamel Benutzer

    Ich habe anbei mal einen DUMP gezogen (Excel) vom 01.04.2015...
    Wenn man in der Übersicht der Kartonstrecke guckt, sieht man, dass ein Wert doppelt ist. (Zeile 80/81)

    Das ist aber so gewollt. Also es gab wirklich zwei Sendungen mit jeweils 22,2 KG... Die dürfen natürlich nicht entfernt werden.
     

    Anhänge:

  10. akretschmer

    akretschmer Datenbank-Guru

    Dann lies das, was Dir mehrfach gesagt wurde.
     
  11. Gargamel

    Gargamel Benutzer

    Wenn ich eine Lösung hätte, würde ich hier nicht schreiben... Da ich also Hilfe brauche, bringt mich deine Antwort nicht weiter.
    Man merkt also dass ich kein SQL Experte bin...

    Danke :)
     
  12. Distrilec

    Distrilec Datenbank-Guru

    Man nehme das von dir gepostete Select:
    Und man nehme meine Änderungen vor:
    PHP:
    SELECT T3.[TrnspName], SUM(T.[U_Gewicht_Waage])
    FROM
    (
        
    SELECT T0.[U_Gewicht_Waage], T0.[U_Versandart], T0.[CreateDateFROM [dbo].[@VERSAND_KARTONT0
        UNION ALL
        SELECT T1
    .[U_Gewicht_Waage], T1.[U_Versandart], T1.[CreateDateFROM [dbo].[@VERSAND_SONDERT1
        UNION ALL
        SELECT T2
    .[U_Gewicht_Waage], T2.[U_Versandart], T2.[CreateDateFROM [dbo].[@VERSAND_PALETTENT2
    T
    INNER JOIN OSHP T3 ON T
    .[U_Versandart] = T3.[TrnspCode]
    WHERE T.[CreateDate] >=[%0] AND T.[CreateDate] <=[%1]
    GROUP BY T3.[TrnspName]
    Und siehe da... Wunderbar... Änderung vollzogen :)

    Edit:
    Man beachte das eingefügte Wort "ALL" in Zeile 5 und 7
     
    Gargamel gefällt das.
  13. Gargamel

    Gargamel Benutzer

    Herzlichen Dank.
    Daumen hoch...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden