【问题标题】:Transforming shape of a SQL Table using Pivot使用 Pivot 转换 SQL 表的形状
【发布时间】:2012-06-22 17:17:40
【问题描述】:

我有一些数据以下列格式存储在表格中

BatchID              EntityChanged             ChangeValue

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

可以出现在“EntityChanged”列中的值列表是有限的,事先已知并且其中没有空格等。为了争论,让我们说这个列表是 - ABC,ABCD,Something,SomethingMore

那么对于上面的数据集,我想要一个输出

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

使用 Pivot 我只能走这么远。

有人可以帮我以所需的方式分割这些数据吗?

【问题讨论】:

标签: sql sql-server sql-server-2008-r2 pivot


【解决方案1】:

您可以为此使用 PIVOT,通过静态 PIVOT 或动态 PIVOT,如果您有未知数量的列,这可能会很好。

静态(见SQL Fiddle with Demo):

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 Fiddle with Demo):

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)

两者都会给你相同的结果。

【讨论】:

    【解决方案2】:

    试试这个:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多