使用枢轴一个SQL表的转化形状(Transforming shape of a SQL Table

2019-09-18 07:30发布

我有存储在一个表中的格式如下一些数据

BatchID              EntityChanged             ChangeValue

EERS                  ABC                       DEF
EERS                  ABCD                      XYZ
EERS                  Something                 SomeValue
New Batch             SomethingMore             GHI

能出现在“EntityChanged”列中的值的列表是有限的,事先知晓的,没有空格等在里面。 为了讨论的方便,让我们说,这个名单是 - ABC,ABCD的东西,SomethingMore

然后,对于上述数据集我想的输出

BatchID            ABC              ABCD            Something       SomethingMore
EERS               DEF              XYZ             SomeValue       NULL   
New Batch          NULL             NULL            NULL            GHI

使用数据透视我只能走这么远。

有人可以帮我切以希望的方式这个数据?

Answer 1:

尝试这个:

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

DEMO



Answer 2:

您可以使用PIVOT这一点,无论是通过静态PIVOT或者如果你有一个未知的列数,这可能是一个很好的动态支点。

静态(参见SQL拨弄演示 ):

create table t2
(
    batchid varchar(10),
    entitychanged varchar(20),
    changevalue varchar(10)
)

insert into t2 values ('EERS', 'ABC', 'DEF')
insert into t2 values ('EERS', 'ABCD', 'XYZ')
insert into t2 values ('EERS', 'Something', 'SomeValue')
insert into t2 values ('New Batch', 'SomethingMore', 'GHI')

select *
from 
(
    select batchid, entitychanged, changevalue
    from t2
) x
pivot
(
    min(changevalue)
    for entitychanged in ([ABC], [ABCD], [Something], [SomethingMore])
) p

动态(参见SQL拨弄演示 ):

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)

这两个给你同样的结果。



文章来源: Transforming shape of a SQL Table using Pivot