首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据透视表和连接列

数据透视表和连接列
EN

Stack Overflow用户
提问于 2008-10-01 20:03:58
回答 2查看 23K关注 0票数 15

我有一个以下格式的数据库:

代码语言:javascript
复制
 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将其转换为以下格式:

代码语言:javascript
复制
ID    A_Z   B_C   MONTH
1     4     0     7/1/2008
2     0     2     7/2/2008
1     0     3     7/2/2008

因此,TYPESUBTYPE被连接到新的列中,并且COUNTIDMONTH匹配的地方求和。

任何建议都将不胜感激。这在SQL中是可能的,还是应该手动编程?

数据库为SQL Server 2005。

假设有100个TYPESSUBTYPES,那么'A‘和'Z’不应该是硬编码的,而是动态生成的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-10-01 21:18:38

SQL Server2005提供了一个非常有用的PIVOT和UNPIVOT运算符,它允许您使用PIVOT和一些代码生成/动态SQL使代码免维护

代码语言:javascript
复制
/*
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)
票数 33
EN

Stack Overflow用户

发布于 2008-10-01 20:12:55

代码语言:javascript
复制
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

您更改需求的次数比我们的营销团队还多!如果你想让它是动态的,你需要依赖于一个存储过程。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/159456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档