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

Zwei Tabellen zusammenfügen + GROUP BY

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von maupa123, 17 Februar 2015.

  1. maupa123

    maupa123 Neuer Benutzer

    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.
     
  2. Distrilec

    Distrilec Datenbank-Guru

    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 :)
     
    Walter gefällt das.
  3. maupa123

    maupa123 Neuer Benutzer

    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
    [​IMG]
     
  4. Distrilec

    Distrilec Datenbank-Guru

    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
     
    maupa123 gefällt das.
  5. maupa123

    maupa123 Neuer Benutzer

    OK super Danke!
    Hab es noch erweitert und hat alles geklappt.
     
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