2008-10-01 10 views
12

I ont une base de données dans le format suivant:Pivot Table et Concaténer Colonnes

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 

Puis-je utiliser SQL pour le convertir en ceci:

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

Ainsi, le TYPE, SUBTYPE sont concaténées en nouvelles colonnes et COUNT est additionné où les ID et MONTH correspondent.

Des conseils seraient appréciés. Est-ce possible en SQL ou dois-je le programmer manuellement?

La base de données est SQL Server 2005.

On suppose il y a 100s de TYPES et SUBTYPES ainsi et « A » et « Z » ne doivent pas être codés en dur, mais générés dynamiquement.

Répondre

28

SQL Server 2005 offre une très utile PIVOT et opérateur UNPIVOT qui vous permettent de faire ce sans entretien de code à l'aide PIVOT et une génération de code/SQL dynamique

/* 
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

vous remercie m'a sauvé journée! – 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 

Vous modifiez les exigences plus que notre équipe marketing! Si vous voulez que ce soit dynamique, vous aurez besoin de se rabattre sur un sproc.

+3

+1 pour les tbl_why_would_u_do_this –