2 Stimmen

SQL Merge 3 Tabellen nach Datum, wo einige Daten fehlen

Ich habe 3 Tabellen, die ich zusammenführen möchte, jede mit einer anderen Spalte von Interesse. Die Idee ist, dass ich X, Y und Z nach Datum (innerhalb der ID) zusammenführen möchte und fehlende Werte habe, wenn dieses Datum für eine bestimmte Variable nicht existiert.

Table X:
ID     Date         X
1      2012-01-01   101
1      2012-01-02   102
1      2012-01-03   103
1      2012-01-04   104
1      2012-01-05   105
2      2012-01-01   150

Table Y:
ID     Date         Y
1      2012-01-01   301
1      2012-01-02   302
1      2012-01-03   303
1      2012-01-11   311
2      2012-01-01   350

Table Z:
ID     Date         Z
1      2012-01-01   401
1      2012-01-03   403
1      2012-01-04   404
1      2012-01-11   411
1      2012-01-21   421
2      2012-01-01   450

Desired Result Table:
ID     Date         X     Y     Z
1      2012-01-01   101   301   401
1      2012-01-02   102   302   .
1      2012-01-03   103   303   403
1      2012-01-04   104   .     404
1      2012-01-05   105   .     .
1      2012-01-11   .     311   411
1      2012-01-21   .     .     421
2      2012-01-01   150   350   450

Haben Sie eine Idee, wie Sie diese SQL-Anweisung schreiben können? Ich habe versucht, mit "full joins" und wo Anweisungen für Cross-Produkte, aber ich halte immer doppelte Werte für einige meiner ID-Datum-Kombinationen, oder manchmal keine ID.

Für jede Hilfe wären wir dankbar.

3voto

Amy B Punkte 104656

Verbindungen können eine knifflige Angelegenheit sein. Mein üblicher Ansatz ist es, zuerst die Schlüssel zu bilden und dann diese Schlüssel zu verwenden, um das zu bekommen, was ich will.

SELECT source.ID, source.Date, x.X, y.Y, z.Z
FROM
(
  SELECT ID, Date
  FROM TableX
  UNION
  SELECT ID, Date
  FROM TableY
  UNION
  SELECT ID, Date
  FROM TableZ
) as source
LEFT JOIN TableX x ON source.ID = x.ID AND source.Date = x.Date
LEFT JOIN TableY y ON source.ID = y.ID AND source.Date = y.Date
LEFT JOIN TableZ z ON source.ID = z.ID AND source.Date = z.Date
ORDER BY source.ID, source.Date

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X