首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有动态列号的T-SQL分组

带有动态列号的T-SQL分组
EN

Stack Overflow用户
提问于 2012-08-07 23:28:27
回答 2查看 589关注 0票数 0

假设我有一个类似1D的表,如下所示:

代码语言:javascript
运行
复制
TBL_1
[ Task  ][ Entity ][ Timespan ]
[ TASK1 ][  ID1   ][    3     ]
[ TASK2 ][  ID2   ][    4     ]
[ TASK2 ][  ID1   ][    5     ]
[ TASK1 ][  ID2   ][    6     ]

如何将其转换为类似2D的视图,如下所示:

代码语言:javascript
运行
复制
[ Entity ][ TASK1 ][ TASK2 ]
[  ID1   ][   3   ][   5   ]
[  ID2   ][   6   ][   4   ]

考虑到任务的数量应该是动态的?

我目前的解决方案是这样的:

代码语言:javascript
运行
复制
SELECT A.Entity, B.Task TASK1, C.Task TASK2
FROM (SELECT DISTINCT ENTITY FROM TBL_1) A
LEFT JOIN TBL_1 B
ON A.Entity = B.Entity AND B.Task = 'TASK1'
LEFT JOIN TBL_1 C
ON A.Entity = C.Entity AND C.Task = 'TASK2'

但这需要我对任务进行“硬编码”。我怎么才能让它动态化呢?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-07 23:40:23

您正在寻找PIVOT。为此,您可以使用动态SQL透视。此策略将在执行查询时获取要转换的列名:

代码语言:javascript
运行
复制
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(task) 
                    from t1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT entity, ' + @cols + ' from 
             (
                select entity, task, timespan
                from t1
            ) x
            pivot 
            (
                min(timespan)
                for task in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo

票数 3
EN

Stack Overflow用户

发布于 2012-08-07 23:51:28

你也可以按照你所尝试的精神来做这件事。但是,使用group by比您尝试的方法简单得多:

代码语言:javascript
运行
复制
SELECT ENTITY,
       max(case when t.task = 'Task1' then timespan end) as task1,
       max(case when t.task = 'Task2' then timespan end) as task2,
       . . .
FROM TBL_1 t
group by entity

要动态生成列,您需要使用动态SQL。这真的是你想要的吗?

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

https://stackoverflow.com/questions/11849196

复制
相关文章

相似问题

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