2008-10-01 10 views
12

Ich habe eine Datenbank in folgendem Format:Pivot-Tabelle und Concatenate Spalten

ID TYPE SUBTYPE COUNT MONTH 
1  A  Z   1  7/1/2008 
1  A  Z   3  7/1/2008 
2  B  C   2  7/2/2008 
1  A  Z   3  7/2/2008 

Kann ich SQL es in diese konvertieren:

ID A_Z B_C MONTH 
1  4  0  7/1/2008 
2  0  2  7/2/2008 
1  0  3  7/2/2008 

Also, die TYPE werden SUBTYPE verketteten in neue Spalten und COUNT wird summiert, wo die ID und MONTH übereinstimmen.

Alle Tipps würden wir uns freuen. Ist das in SQL möglich oder soll ich es manuell programmieren?

Die Datenbank ist SQL Server 2005.

Angenommen, es gibt 100s von TYPES und SUBTYPES so und ‚A‘ und ‚Z‘ nicht hart codiert werden soll, sondern dynamisch erzeugt.

Antwort

28

SQL Server 2005 bietet eine sehr nützliche PIVOT und UNPIVOT Operator, können Sie diesen Code wartungsfrei machen PIVOT verwenden und einige Code-Generierung/dynamische SQL

/* 
CREATE TABLE [dbo].[stackoverflow_159456](
    [ID] [int] NOT NULL, 
    [TYPE] [char](1) NOT NULL, 
    [SUBTYPE] [char](1) NOT NULL, 
    [COUNT] [int] NOT NULL, 
    [MONTH] [datetime] NOT NULL 
) ON [PRIMARY] 
*/ 

DECLARE @sql AS varchar(max) 
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique 
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique 

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + PIVOT_CODE + ']' 
     ,@select_list = COALESCE(@select_list + ', ', '') + 'ISNULL([' + PIVOT_CODE + '], 0) AS [' + PIVOT_CODE + ']' 
FROM (
    SELECT DISTINCT [TYPE] + '_' + SUBTYPE AS PIVOT_CODE 
    FROM stackoverflow_159456 
) AS PIVOT_CODES 

SET @sql = ' 
;WITH p AS (
    SELECT ID, [MONTH], [TYPE] + ''_'' + SUBTYPE AS PIVOT_CODE, SUM([COUNT]) AS [COUNT] 
    FROM stackoverflow_159456 
    GROUP BY ID, [MONTH], [TYPE] + ''_'' + SUBTYPE 
) 
SELECT ID, [MONTH], ' + @select_list + ' 
FROM p 
PIVOT (
    SUM([COUNT]) 
    FOR PIVOT_CODE IN (
     ' + @pivot_list + ' 
    ) 
) AS pvt 
' 

EXEC (@sql) 
+0

dankt Ihnen gespeichert meine Tag! – TheVillageIdiot

6
select id, 
sum(case when type = 'A' and subtype = 'Z' then [count] else 0 end) as A_Z, 
sum(case when type = 'B' and subtype = 'C' then [count] else 0 end) as B_C, 
month 
from tbl_why_would_u_do_this 
group by id, month 

Sie ändern Anforderungen mehr als unser Marketing-Team! Wenn Sie möchten, dass es dynamisch ist, müssen Sie auf einen Sproc zurückgreifen.

+3

+1 für die tbl_why_would_u_do_this –