2017-02-27 2 views
0

Ich habe Daten aus SELECT-Abfrage, die auf diese Weise aus:Wählen Transformation Tabelle

  Id        EventName Quantity 
A930FF06-B9F2-4D06-A28E-00037E82DDB1 DiscountClick 40 
A930FF06-B9F2-4D06-A28E-00037E82DDB1 DiscountLike 1 
A930FF06-B9F2-4D06-A28E-00037E82DDB1 DiscountSave 11 
A930FF06-B9F2-4D06-A28E-00037E82DDB1 DiscountView 2579 
28D64EEB-97FB-45A9-AA4C-00359FF6FF42 DiscountClick 22 
28D64EEB-97FB-45A9-AA4C-00359FF6FF42 DiscountSave 1 
28D64EEB-97FB-45A9-AA4C-00359FF6FF42 DiscountView 971 

ich verwandeln will es die Tabelle aussieht:

Id          DiscountView Discount... 
A930FF06-B9F2-4D06-A28E-00037E82DDB1 2579 
28D64EEB-97FB-45A9-AA4C-00359FF6FF42 971 

Wie kann ich das tun?

+0

Sie suchen 'PIVOT' – Rahul

+0

Wird es nur sein, die drei Optionen? – JohnHC

Antwort

0

Dies ist die traditionelle Kreuztabelle/bedingte Aggregation Version eines pivot():

select 
    Id 
    , DiscountView = sum(case when EventName = 'DiscountView' then Quantity end) 
    , DiscountSave = sum(case when EventName = 'DiscountSave' then Quantity end) 
    , DiscountLike = sum(case when EventName = 'DiscountLike' then Quantity end) 
from t 
group by Id 

pivot() Version:

select 
    Id 
    , DiscountView 
    , DiscountSave 
    , DiscountLike 
from t 
pivot (sum(Quantity) for EventName in (DiscountView, DiscountSave, DiscountLike)) pvt 
+0

T langsam. Ich habe es schon mit Variablen. und Fall dann sonst Bedingung. – Nerf

+0

@Nerf Okay, ich bin mir nicht sicher, was Sie sagen wollen, aber danke für den Downvote. – SqlZim

+0

Diese Antwort ist nützlicher. Ich stimme zu. Wenn Sie es von C# ausführen möchten, haben Sie möglicherweise Probleme Sohn keine Datenbankabhängigkeit, einfache Abfrage schreiben und ausführen, wenn die Abfrage spät ist, kann Verbesserung sein. @Nerf –

1

Dies ist die dynamische Pivot-Abfrage für Ihr Problem.

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX), 
     @PivotColumnNames AS NVARCHAR(MAX), 
     @PivotSelectColumnNames AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','') 
+ QUOTENAME(EventName) 
FROM (SELECT DISTINCT EventName FROM test_table) AS Courses 

--Get distinct values of the PIVOT Column with isnull 
SELECT @PivotSelectColumnNames 
    = ISNULL(@PivotSelectColumnNames + ',','') 
    + 'ISNULL(' + QUOTENAME(EventName) + ', 0) AS ' 
    + QUOTENAME(EventName) 
FROM (SELECT DISTINCT EventName FROM test_table) AS Courses 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT Id, ' + @PivotSelectColumnNames + ' 
    FROM test_table 
    pivot(sum(quantity) for EventName in (' + @PivotColumnNames + ')) as pvt'; 

--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

enter image description here

+0

Was ist nicht NULL, aber 0 dafür? – Nerf

+0

Ungültiger Spaltenname "Quantity". – Nerf

+0

Jetzt aktualisiert .... um Null als '0' zu ändern –