3 Stimmen

Wie man ein SQL-Self-Join mit Nullen durchführt

Ich verwende MS SQL 2008. Meine Tabelle sieht so aus:

| Name  | Code | Amt  |
| ----- | ---- | ---- |
| April |  A   | 1.23 |
| Barry |  A   | 2.34 |
| Barry |  B   | 3.45 |
| Cliff |  A   | 4.56 |
| Cliff |  B   | 5.67 |
| Cliff |  C   | 6.78 |

Ich möchte die Ausgabe wie folgt haben:

| Name  | Code_A | Code_B | Code_C |
| ----- | ------ | ------ | ------ |
| April |  1.23  |  NULL  |  NULL  |  
| Barry |  2.34  |  3.45  |  NULL  |
| Cliff |  4.56  |  5.67  |  6.78  |

Die NULLs können null sein.

Mit einem Self-Join kann ich Cliff erhalten, aber ich kann Barry und April nicht erhalten, weil ich etwas in der Art von diesem verwende, was nur ausgegeben wird, wenn alle drei Bedingungen verfügbar sind.

SELECT     a.Name, a.Amt Code_A, b.Amt Code_B, c.Amt Code_C
FROM       Table_1 as c INNER JOIN
                  Table_1 AS b ON c.Name = b.Name INNER JOIN
                  Table_1 AS a ON b.Name = a.Name 
WHERE     (a.Code = 'A') AND (b.Code = 'B') AND (c.Code = 'C')

4voto

Michael Fredrickson Punkte 36194

Statt JOINs denke ich, dass ein PIVOT hier mehr angemessen ist:

SELECT 
    Name, 
    [A] AS Code_A, 
    [B] AS Code_B, 
    [C] AS Code_C
FROM (
    SELECT Name, Code, Amount
    FROM Table_1
) t
PIVOT (
    SUM(Amount)
    FOR Code IN ([A], [B], [C])
) AS pvt

2voto

Mike Ryan Punkte 4034

Eine vollständig SQL-Engine-agnostische Möglichkeit ist:

select names.Name, 
   (select sum(a2.Amt) from amounts a2
    where a2.Name = names.Name
       and a2.Code = 'A') as AmtA,
   (select sum(a3.Amt) from amounts a3
    where a3.Name = names.Name
       and a3.Code = 'B') as AmtB,
   (select sum(a4.Amt) from amounts a4
    where a4.Name = names.Name
       and Code = 'C') as AmtC
from (select distinct Name from amounts) as names

Wo Sie den eindeutigen Satz von Namen auswählen und dann die Beträge für jeden bestimmten Code zusammenfassen. Dies soll mehr dazu dienen, wie SQL funktioniert.

In der Praxis würde ich dies tatsächlich nicht in Ihrem Fall verwenden - `PIVOT` wird für jede Engine, die sie unterstützt, viel effizienter sein. Wie hier gezeigt: http://sqlfiddle.com/#!3/7cb0a/5

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