2008-10-01 42 views
12

que tienen una base de datos en el siguiente formato:la tabla pivote y Concatenar Columnas

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 

¿Puedo utilizar SQL para convertirlo en esto:

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

Así, el TYPE, SUBTYPE se concatenan en nuevas columnas y COUNT se suman donde coinciden ID y MONTH.

Cualquier consejo sería apreciado. ¿Es esto posible en SQL o debería programarlo manualmente?

La base de datos es SQL Server 2005.

Supongamos que hay 100s de TYPES y SUBTYPES así y 'A' y 'Z' no debe ser codificadas duro pero generadas dinámicamente.

Respuesta

28

SQL Server 2005 ofrece un pivote y UNPIVOT operador muy útil que le permiten hacer sin necesidad de mantenimiento utilizando el código de pivote y un poco de generación de código/SQL dinámico

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

gracias guardó mi ¡día! – 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 

¡Usted cambia los requisitos más que nuestro equipo de marketing! Si quieres que sea dinámico, deberás recurrir a un sproc.

+3

+1 para los tbl_why_would_u_do_this –