2017-03-09 2 views
0

Ich habe eine Sammlung von Daten, die hat; Eine Kategorie, ein Datum, eine Zeichenfolge und zwei Werte. Ein vereinfachtes Beispiel dafür, wie diese Daten unter:Pivot kategorisierte Daten

| Category | TheDate | TheString | TotalA | TotalB | 
---------------------------------------------------------- 
| CatA  | 01/01/01 | foo1  | 100 | 200 | 
| CatA  | 01/01/01 | foo2  | 100 | 200 | 
| CatA  | 01/01/01 | foo3  | 100 | 200 | 
| CatA  | 02/01/01 | foo4  | 100 | 200 | 
| CatA  | 02/01/01 | foo5  | 100 | 200 | 
| CatA  | 03/01/01 | foo6  | 100 | 200 | 
| CatA  | 04/01/01 | foo7  | 100 | 200 | 
| CatB  | 01/01/01 | foo8  | 100 | 200 | 
| CatB  | 01/01/01 | foo9  | 100 | 200 | 
| CatB  | 06/01/01 | foo2  | 100 | 200 | 

Ich mag diese Daten schwenken, so dass es eine Tabelle erstellt wie unten:

| TheDate | TotalAForCatA | TotalAForCatB | TotalBForCatA | ... | 
------------------------------------------------------------------- 
| 01/01/01 | 300   | 200   | 600   | ... | 
| 02/01/01 | 200   | 0   | 400   | ... | 
| 03/01/01 | 100   | 0   | 200   | ... | 
| 04/01/01 | 100   | 0   | 200   | ... | 
| 06/01/01 | 0   | 100   | 0   | ... | 

Dies ist eine Tabelle mit dem Datum gruppiert werden würde, mit jede Summe ist die Summe der Werte für jede Kategorie.

Wie würde ich das erreichen?

+0

Ist das eine feste Anzahl von Spalten oder kann dynamisch sein? –

Antwort

2

Datenabtastblock

CREATE TABLE Table1 
    (Category varchar(4), TheDate datetime, TheString varchar(4), TotalA int, TotalB int) 
go 

INSERT INTO Table1 
    (Category,TheDate, TheString, TotalA, TotalB) 
VALUES 
    ('CatA', '2001-01-01 00:00:00', 'foo1', 100, 200), 
    ('CatA', '2001-01-01 00:00:00', 'foo2', 100, 200), 
    ('CatA', '2001-01-01 00:00:00', 'foo3', 100, 200), 
    ('CatA', '2001-02-01 00:00:00', 'foo4', 100, 200), 
    ('CatA', '2001-02-01 00:00:00', 'foo5', 100, 200), 
    ('CatA', '2001-03-01 00:00:00', 'foo6', 100, 200), 
    ('CatA', '2001-04-01 00:00:00', 'foo7', 100, 200), 
    ('CatB', '2001-01-01 00:00:00', 'foo8', 100, 200), 
    ('CatB', '2001-01-01 00:00:00', 'foo9', 100, 200), 
    ('CatB', '2001-06-01 00:00:00', 'foo2', 100, 200) 
go 

Bedingte Aggregation, wenn alle Spalten

select theDate, 
sum(case when category='CatA' then TotalA else 0 end) 'TotalAForCatA', 
sum(case when category='CatB' then TotalA else 0 end) 'TotalAForCatB', 
sum(case when category='CatA' then TotalB else 0 end) 'TotalBForCatA', 
sum(case when category='CatB' then TotalB else 0 end) 'TotalBForCatB' 
from table1 
group by thedate 

Sie könnten auch PIVOT verwenden bekannt sind, wenn Sie wissen, eine feste Anzahl von Spalten gibt.

Wenn Spalten variieren, müssen Sie ein dynamisches SQL-Skript erstellen und ausführen. Siehe Link unten:

Simplify Dynamic SQL Pivot Table

+0

Es wird eine feste Anzahl von Spalten geben, wäre ein Drehpunkt schneller als oben? –