我有一个以下格式的数据库:
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
我可以使用SQL将其转换为:
ID A_Z B_C MONTH 1 4 0 7/1/2008 2 0 2 7/2/2008 1 0 3 7/2/2008
所以,在TYPE
,SUBTYPE
连接成新的列和COUNT
总结的地方ID
和MONTH
比赛.
任何提示将不胜感激.这可能在SQL中,还是我应该手动编程?
该数据库是SQL Server 2005.
假设有数百TYPES
和SUBTYPES
因此与"A"和"Z"不应该被硬编码,但动态生成的.
SQL Server 2005提供了一个非常有用的PIVOT和UNPIVOT运算符,它允许您使用PIVOT和一些代码生成/动态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)
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
您比我们的营销团队更改需求!如果你想要它是动态的,你需要回到一个sproc上.