2016-11-10 4 views
3

Ich lerne SQL und ich möchte eine Abfrage erstellen, die neue Spalten, die aus Werten aus einer Tabelle gemacht werden. Ich habe eine Spalte mit dem Namen transactions und es gibt mehrere Transaktionen von der gleichen Firma. Tabelle sieht wie folgt aus:Konvertieren von Zeilen in Spalten mit Pivotieren

Id Name Payd 
1 John 5.00 
2 Adam 5.00 
3 John 10.00 
4 John 10.00 
5 Adam 15.00 

ich, so etwas machen möchten:

Id Name 5.00 10.00 15.00 Sum 
1 John 5.00 20.00 0  25.00 
2 Adam 5.00 0  15.00 20.00 

ich erwäge es mit PIVOT Funktion zu tun, aber ich habe Probleme bei der Umsetzung. Mein Code sieht in etwa wie folgt aus:

(select emplployer, CAST (4.00 as decimal(10,0)) as [4.00], 
CAST (5.00 as decimal(10,0)) as [5.00], 
CAST (10.00 as decimal(10,0)) as [10.00], 
CAST (18.00 as decimal(10,0)) as [18.00], 
CAST (20.00 as decimal(10,0)) as [20.00] 
from (select Name, cast(Payd as decimal(10,0)) as summ from employee) q1 
pivot 
(
    sum(summ) for employer in ([4.00], [5.00], [10.00], [18.00], [20.00]) 
)pvt; 

Antwort

3

Bedingte Aggregation Methode:

SELECT 
    Name 
    ,SUM(CASE WHEN Payd = 5 THEN Payd ELSE 0 END) as [5.00] 
    ,SUM(CASE WHEN Payd = 10 THEN Payd ELSE 0 END) as [10.00] 
    ,SUM(CASE WHEN Payd = 15 THEN Payd ELSE 0 END) as [15.00] 
    ,SUM(Payd) as [Sum] 
FROM 
    @Employees 
GROUP BY 
    Name 

One Way es mit Pivot zu tun:

;WITH cte AS (
    SELECT 
     Name 
     ,Payd 
     ,Payd as PaydColNames 
    FROM 
     @Employees 
) 

SELECT 
    Name 
    ,[5.00] = ISNULL([5.00],0) 
    ,[10.00] = ISNULL([10.00],0) 
    ,[15.00] = ISNULL([15.00],0) 
    ,[Sum] = ISNULL([5.00],0) + ISNULL([10.00],0) + ISNULL([15.00],0) 
FROM 
    cte 
    PIVOT (
     SUM(Payd) FOR PaydColNames IN ([5.00],[10.00],[15.00]) 
    ) p 

Das Problem, das Sie mit zu sein scheinen ist, dass Sie sind Versuchen Sie, dieselbe Spalte zu verwenden, um auf das Aggregieren zu pivotieren, das Ihnen nicht das gewünschte Ergebnis gibt. Sie müssen also die Payd-Spalte replizieren, damit Sie die Daten sowohl als PIVOT als auch als Aggregat verwenden können. Dann, weil Sie die 0 wünschen, wenn der Wert NULL ist, müssen Sie ISNULL oder COALESCE verwenden, um den NULL zu beseitigen. Meiner Meinung nach wird Bedingte Aggregation Ihnen für eine solche Verwendung besser dienen.

Testdaten

DECLARE @Employees AS TABLE (Id INT, Name VARCHAR(50), Payd MONEY) 
INSERT INTO @Employees VALUES 
(1,'John',5.00) 
,(2,'Adam',5.00) 
,(3,'John',10.00) 
,(4,'John',10.00) 
,(5,'Adam',15.00) 
+0

Das ist eine schöne Erklärung war, vielen Dank! – vidooo

Verwandte Themen