Alternativen zu UNION ALL, um aggregierte data zu erhalten

Was sind Alternativen zu UNION ALL für den Beitritt zu vielen Tabellen, um aggregierte data aus vielen Quellsystemen zu sehen? Ich suche eine Lösung jenseits von T-SQL.

Angenommen, wir haben 3 Quellentabellen und wir wollen ihnen durch ID join:

TableA

id Adata 1 8383 2 2707 3 6181 4 6708 

TabelleB

 id Bdata 1 2669 1 8582 2 6335 2 7355 3 7355 3 2277 4 2789 4 8566 

TabelleC

 id Adata 1 2856 2 1364 3 4476 4 3311 4 8073 

Die gewünschte Ergebnistabelle, die ich bekommen möchte:

Bildbeschreibung hier eingeben

Der primitive path, den ich jetzt mache, um es zu bekommen (von UNION ALL):

Bildbeschreibung hier eingeben

Erreichen der gewünschten Ergebnisse durch die Schaffung von riesigen Tisch, bestehend aus vielen Tischen untereinander und viele Nullen scheint sehr frustrierend und primitive Lösung, wenn wir viele Spalten und viele Tische haben. Ich denke, das ist ein gemeinsames Problem, wenn wir uns mit verschiedenen Informationssystemen wie Buchhaltung, Lohn- und Gehaltsabrechnung,

Das letzte Ziel ist es, zu geben und Excel Benutzer aggregierte data mit einer Chance zu bohren begrenzt auf ausgewählte Tabelle. Zum Beispiel durch Doppelklick in der gewünschten Ergebnis-Tabelle in der ersten Bdata 11251 ist der Benutzer intrested, um nur die data zu sehen, die diese Figur machen. Aber stattdessen bekommt der Benutzer das:

Bildbeschreibung hier eingeben

Aktualisieren. Ich möchte eine Chance für drill down in data zu bewahren. Also möchte ich alle Details für jede ID sehen, wenn ich in Excel auf die Ergebnistabelle doppelklicke.

Mit deinem Beispiel scheint ein einfacher Join genug zu sein, warum müsstest du UNION ALL ?

 SELECT A.id, SUM(A.Adata), SUM(B.Bdata), SUM(C.Cdata) FROM TableA A JOIN TableB B ON A.id = B.id JOIN TableC C ON A.id = C.id GROUP BY A.id 

Wenn Sie die Gesamtsumme WITH ROLLUP möchten, können Sie WITH ROLLUP :

 SELECT ISNULL(sub.id,'Total') AS "id", sub.Adata, sub.Bdata, sub.Cdata FROM ( SELECT A.id, SUM(A.Adata) AS Adata, SUM(B.Bdata) AS Bdata, SUM(C.Cdata) AS Cdata FROM TableA A JOIN TableB B ON A.id = B.id JOIN TableC C ON A.id = C.id GROUP BY A.id WITH ROLLUP) sub 

Du solltest innere Joins benutzen. Union (Alle) scheint nicht notwendig, wenn einige Ids in einigen Tabellen fehlen:

 Select coalesce(cast(i.id as varchar(10)), 'SUM') , isnull(sum(A.data), '') , isnull(sum(B.data), '') , isnull(sum(C.data), '') From (Select id From A Union Select id From B Union Select id From C ) as i left Join A on A.id = i.id left Join B on B.id = i.id left Join C on C.id = i.id group by grouping sets (i.id, ()) 

Gruppierungssatz fügt die Gesamtzeile hinzu.

Dies kann eine Lösung für das, was Sie fragen.

 select id,Adata,Bdata,SUM(Cdata) as Cdata from ((select id,Adata,SUM(Bdata) as Bdata from (A join B using(id)) group by id)T join C using(id)) group by id 

Es könnte keine passende Antwort sein.

Um die gewünschte Ausgabe zu erhalten (mit der SUM-Zeile)

 SELECT CAST(A.id AS VARCHAR(100)) AS ID, (SELECT SUM(Aa.Adata) FROM TableA Aa WHERE A.id = Aa.id GROUP BY Aa.id) AS Adata, (SELECT SUM(Ba.Bdata) FROM TableB Ba WHERE B.id = Ba.id GROUP BY Ba.id) AS Bdata, (SELECT SUM(Ca.Cdata) FROM TableC Ca WHERE C.id = Ca.id GROUP BY Ca.id) AS Cdata FROM TableA A INNER JOIN TableB B ON A.id = B.id INNER JOIN TableC C ON A.id = C.id GROUP BY A.id, B.id, C.id UNION ALL SELECT CAST('SUM' AS VARCHAR(100)), SUM(A.Adata), (SELECT SUM(B.Bdata) FROM TableB B), (SELECT SUM(C.Cdata) FROM TableC C) FROM TableA A 

Ausgabe:

 ID Adata Bdata Cdata 1 8383 11251 2856 2 2707 6335 1364 3 6181 9632 4476 4 6708 11355 11384 SUM 23979 38573 20080 

SQL Fiddle: http://sqlfiddle.com/#!3/ba58d/11/0

Sie sind miximg Konzepte. UNION ALL ist etwas seltenes und gebraucht. Sie verwenden es beim Kleben von ähnlichen Ergebnismengen zusammen. Dies ist hier nicht der Fall.

Um Tafeln zu verbinden, solltest du natürlich selbst join. Sie erhalten eine Ergebniszeile pro Gruppe, die Sie mit GROUP BY (die ID in Ihrem Fall) angeben. Sie verwenden Aggregationsfunktionen wie SUM, MAX, COUNT usw., um data zu aggregieren.

Die zu schreibende Abfrage hängt davon ab, ob alle IDs in Tabelle A und den anderen Tabellen vorhanden sein sollen. Der Unterschied ist vor allem die Art der Verbindung verwendet dann.

ID muss in allen Tabellen vorhanden sein:

 select id, sum(a.adata), sum(b.bdata), sum(c.cdata) from a join b using (id) join c using (id) group by id; 

ID muss nur in Tabelle a angegeben werden:

 select id, sum(a.adata), coalesce(sum(b.bdata),0), coalesce(sum(c.cdata),0) from a left join b using (id) left join c using (id) group by id; 

ID muss nicht in einer bestimmten Tabelle existieren:

 select id, coalesce(sum(a.adata),0), coalesce(sum(b.bdata),0), coalesce(sum(c.cdata),0) from a full outer join b using (id) full outer join c using (id) group by id; 

EDIT: Ich sollte hinzufügen, dass SQL server die USING-Klausel nicht unterstützt (was Standard SQL2003 ist). Sie können es durch eine ON-Klausel replace, was einfach ist, solange man keine vollständigen äußeren Joins braucht, die viel komplizierter ohne eine Klausel sind.

Und: Du bekommst eine Summenzeile am Ende, group by rollup(id) anstelle von nur group by id .