假设我有一个类似1D的表,如下所示:
TBL_1
[ Task ][ Entity ][ Timespan ]
[ TASK1 ][ ID1 ][ 3 ]
[ TASK2 ][ ID2 ][ 4 ]
[ TASK2 ][ ID1 ][ 5 ]
[ TASK1 ][ ID2 ][ 6 ]如何将其转换为类似2D的视图,如下所示:
[ Entity ][ TASK1 ][ TASK2 ]
[ ID1 ][ 3 ][ 5 ]
[ ID2 ][ 6 ][ 4 ]考虑到任务的数量应该是动态的?
我目前的解决方案是这样的:
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'但这需要我对任务进行“硬编码”。我怎么才能让它动态化呢?
非常感谢!
发布于 2012-08-07 23:40:23
您正在寻找PIVOT。为此,您可以使用动态SQL透视。此策略将在执行查询时获取要转换的列名:
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
发布于 2012-08-07 23:51:28
你也可以按照你所尝试的精神来做这件事。但是,使用group by比您尝试的方法简单得多:
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。这真的是你想要的吗?
https://stackoverflow.com/questions/11849196
复制相似问题