使用Pivot转换SQL表的形状
我有一些数据以以下格式存储在一个表中使用Pivot转换SQL表的形状,sql,sql-server,sql-server-2008-r2,pivot,Sql,Sql Server,Sql Server 2008 R2,Pivot,我有一些数据以以下格式存储在一个表中 BatchID EntityChanged ChangeValue EERS ABC DEF EERS ABCD XYZ EERS Something SomeValue New Batch
BatchID EntityChanged ChangeValue
EERS ABC DEF
EERS ABCD XYZ
EERS Something SomeValue
New Batch SomethingMore GHI
可以出现在“EntityChanged”列中的值列表是有限的,预先知道,并且其中没有空格等。为了便于讨论,让我们假设这个列表是-ABC,ABCD,Something,Something更多
然后对于上面的数据集,我希望输出
BatchID ABC ABCD Something SomethingMore
EERS DEF XYZ SomeValue NULL
New Batch NULL NULL NULL GHI
使用Pivot,我只能走这么远
有人能帮我以所需的方式分割这些数据吗?试试这个:
SELECT BatchID,
MAX(CASE WHEN EntityChanged = 'ABC' THEN ChangeValue END) 'ABC',
MAX(CASE WHEN EntityChanged = 'ABCD' THEN ChangeValue END) 'ABCD',
MAX(CASE WHEN EntityChanged = 'Something' THEN ChangeValue END) 'Something',
MAX(CASE WHEN EntityChanged = 'SomethingMore' THEN ChangeValue END) 'SomethingMore'
FROM YourTable t
GROUP BY BatchID
试试这个:
SELECT BatchID,
MAX(CASE WHEN EntityChanged = 'ABC' THEN ChangeValue END) 'ABC',
MAX(CASE WHEN EntityChanged = 'ABCD' THEN ChangeValue END) 'ABCD',
MAX(CASE WHEN EntityChanged = 'Something' THEN ChangeValue END) 'Something',
MAX(CASE WHEN EntityChanged = 'SomethingMore' THEN ChangeValue END) 'SomethingMore'
FROM YourTable t
GROUP BY BatchID
您可以通过静态透视或动态透视使用透视,如果列数未知,这可能会很好 静态(见): 动态(见):
这两种方法都会得到相同的结果。您可以通过静态透视或动态透视使用透视,如果列数未知,这可能会很好 静态(见): 动态(见): 两者都将给您相同的结果。的可能重复
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(entitychanged)
from t2
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT batchid, ' + @cols + ' from
(
select batchid, entitychanged, changevalue
FROM t2
) x
pivot
(
min(changevalue)
for entitychanged in (' + @cols + ')
) p '
execute(@query)