Zwei Tabellen zusammenfügen + GROUP BY

maupa123

Neuer Benutzer
Beiträge
3
Hallo,

ich habe folgendes Problem.

Zwei Tabellen die ähnlich aussehen. In diesem Fall jetzt die gleichen Spaltennamen haben. Später aber verschieden sein können z.B. Table_1 --> project Table_2 --> projekt

Table_1:
project id fehler
2014007 1 2
2014007 1 1
2014007 2 2
2014007 1 2
2015007 1 2

Table_2:
project id fehler
2014007 1 2
2015123 1 2
2015123 1 2

Abfrage Table_1:
SELECT project, id,
SUM( CASE WHEN fehler = 1 THEN 1 ELSE 0 END)AS Table_1_Fehler_1,
SUM( CASE WHEN fehler = 2 THEN 1 ELSE 0 END)AS Table_1_Fehler_2
FROM Table_1

GROUP BY project, id
ORDER BY project, id;

Abfrage Table_2:
SELECT project, id,
SUM( CASE WHEN fehler = 1 THEN 1 ELSE 0 END)AS Table_2_Fehler_1,
SUM( CASE WHEN fehler = 2 THEN 1 ELSE 0 END)AS Table_2_Fehler_2
FROM Table_2

GROUP BY project, id
ORDER BY project, id

Ergebnis der Abfrage (Table_1):
project id Table_1_Fehler_1 Table_1_Fehler_2
2014007 1 1 2
2014007 2 0 1
2015007 1 0 1

Ergebnis der Abfrage (Table_2):
project id Table_2_Fehler_1 Table_2_Fehler_2
2014007 1 0 1
2015123 1 0 2


Jetzt zum meinem Problem. Ich möchte beide Abfragen zusammenfügen + Gruppierung bei project, id.
Das Ergebnis soll so aussehen.

project id Table_1_Fehler_1 Table_1_Fehler_2 Table_2_Fehler_1 Table_2_Fehler_2
2014007 1 1 2 0 1
2014007 2 0 1 0 0
2015007 1 0 1 0 0
2015123 1 0 0 0 2


Hab schon einiges Probiert bin aber immer am GROUP BY oder sonst was gescheitert.
Vielleicht hat ja jemand eine Lösung.

Datenbank ist MS-SQL-Server

Vielen Dank schon einmal.
 
Werbung:
So etwas in der Art?
Code:
Select t.project_id,
       Sum(Case
              When t1.fehler = 1 Then 1
              Else 0
           End) As table_1_fehler_1,
       Sum(Case
              When t1.fehler = 2 Then 1
              Else 0
           End) As table_1_fehler_2,
       Sum(Case
              When t2.fehler = 1 Then 1
              Else 0
           End) As table_2_fehler_1,
       Sum(Case
              When t2.fehler = 2 Then 1
              Else 0
           End) As table_2_fehler_2
From   (Select project_id
        From   table_1
        Union
        Select project_id
        From   table_2) t
Left   Join table_1 t1
On     t.project_id = t1.project_id
Left   Join table_2 t2
On     t.project_id = t2.project_id
Group  By t.project_id
Order   By t.project_id asc
Ist mit Sicherheit noch optimierungsfähig :)
 
Ok vielen Dank erstmal.
Das schaut schon ganz gut aus. Wär ich nie drauf gekommen (Wie nennt man denn so eine Technik?)
Ich habe jetzt mal versucht das ganze noch auf die id zu erweitern. Leider ist das Ergebnis nicht das, das ich erwarte.

Code:
Select t.project, t.id,
       Sum(Case
            When t1.fehler = 1 Then 1
              Else 0
           End) As table_1_fehler_1,
       Sum(Case
              When t1.fehler = 2 Then 1
              Else 0
           End) As table_1_fehler_2,
       Sum(Case
              When t2.fehler = 1 Then 1
              Else 0
           End) As table_2_fehler_1,
       Sum(Case
              When t2.fehler = 2 Then 1
              Else 0
           End) As table_2_fehler_2
From   (Select project, id
        From   table_1
        Union
        Select project, id
        From   table_2) t
Left   Join table_1 t1
On     t.project = t1.project AND t.id = t1.id
Left   Join table_2 t2
On     t.project = t2.project AND t.id = t2.id
Group  By t.project, t.id
Order   By t.project, t.id asc

 
Diese "Technik" hat meines Wissens nach keinen besonderen Namen... Evtl. noch "self-join"... :)
Alles was ich mache ist -> Ich hole mir die distinct projekte und left joine dann die einzelnen fehler dazu :) (Die dann natürlich summiert werden)

Eine weitere Möglichkeit wäre sowas:

Code:
Select t.project,
       t.id,
       Sum(Case
              When t.t1_fehler = 2 Then
               1
              Else
               0
           End),
        Sum(Case
              When t.t2_fehler = 2 Then
               1
              Else
               0
           End)
       From (Select t1.project,
                     t1.id,
                     t1.fehler as t1_fehler,
                     0 as t2_fehler
              From   table_1 t1
              Union All
              Select t2.project,
                     t2.id,
                     0,
                     t2.fehler
              From   table_2 t2) t
Group By t.project,
          t.id
 
Werbung:
Zurück
Oben