数据透视表和连接列
时间:2020-03-06 14:59:43 来源:igfitidea点击:
我有以下格式的数据库:
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"连接到新的列中,并在" ID"和" MONTH"匹配的地方将" COUNT"相加。
任何提示将不胜感激。这在SQL中是可能的,还是我应该手动对其进行编程?
该数据库是SQL Server 2005.
假设有100个" TYPES"和" SUBTYPES",所以" A"和" Z"不应该硬编码,而是动态生成。
解决方案
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
我们比我们的营销团队更能改变需求!如果我们希望它是动态的,则需要使用一个存储过程。
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)

