SQL Abfrage aus 3 gleichen Tabellen - Gruppierung...

Gargamel

Benutzer
Beiträge
13
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:
Werbung:
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 :)
 
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...
 
Ich habe 3 Tabellen (Versand_Karton T0, Versand_Paletten T1, Versand_Sonder T2)
Alle drei Tabellen besitzen zu 100 % den gleichen Aufbau.

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.
 
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]​
 
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 :)
 
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.[CreateDate] FROM [dbo].[@VERSAND_KARTON] T0
    UNION
    SELECT T1.[U_Gewicht_Waage], T1.[U_Versandart], T1.[CreateDate] FROM [dbo].[@VERSAND_SONDER] T1
    UNION
    SELECT T2.[U_Gewicht_Waage], T2.[U_Versandart], T2.[CreateDate] 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]

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 bearbeitet von einem Moderator:
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 ;) )
 
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

  • inhalte_abfrage.zip
    59,3 KB · Aufrufe: 1
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 :)
 
Man nehme das von dir gepostete Select:
PHP:
SELECT T3.[TrnspName], SUM(T.[U_Gewicht_Waage])
FROM
(
    SELECT T0.[U_Gewicht_Waage], T0.[U_Versandart], T0.[CreateDate] FROM [dbo].[@VERSAND_KARTON] T0
    UNION
    SELECT T1.[U_Gewicht_Waage], T1.[U_Versandart], T1.[CreateDate] FROM [dbo].[@VERSAND_SONDER] T1
    UNION
    SELECT T2.[U_Gewicht_Waage], T2.[U_Versandart], T2.[CreateDate] 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]
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.[CreateDate] FROM [dbo].[@VERSAND_KARTON] T0
    UNION ALL
    SELECT T1.[U_Gewicht_Waage], T1.[U_Versandart], T1.[CreateDate] FROM [dbo].[@VERSAND_SONDER] T1
    UNION ALL
    SELECT T2.[U_Gewicht_Waage], T2.[U_Versandart], T2.[CreateDate] 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]

Und siehe da... Wunderbar... Änderung vollzogen :)

Edit:
Man beachte das eingefügte Wort "ALL" in Zeile 5 und 7
 
Werbung:
Zurück
Oben