开发者社区> 问答> 正文

Dynamic SQL Pivot:基于列值创建新列并解析列名

使用下面的代码:


create table temp
(
    date datetime,
    category varchar(3),
    amount money
)

insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
        FROM temp c
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'SELECT date, ' + @cols + ' from 
        (
            select date
                , amount
                , category
            from temp
       ) x
        pivot 
        (
             max(amount)
            for category in (' + @cols + ')
        ) p '


execute(@query)

drop table temp

我得到的结果是:

Date                        ABC         DEF    GHI
2012-01-01 00:00:00.000     1000.00     NULL    NULL
2012-02-01 00:00:00.000     NULL        500.00  800.00
2012-02-10 00:00:00.000     NULL        700.00  NULL
2012-03-01 00:00:00.000     1100.00     NULL    NULL

但是,我的列值命名约定有所不同,例如,我的数据集可能如下所示:

create table temp
(
    date datetime,
    category varchar(3),
    amount money
)

insert into temp values ('1/1/2012', 'ABC-CO', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC-PR', 1100.00)

“ -CO”和“ -PR”可以出现在任何值之后,而不仅仅是“ ABC”。但是,我需要做的是在出现时从任何列标题中删除“-%”以创建与上述相同的结果表。有谁知道要这样做吗?

展开
收起
Puppet 2020-01-03 11:07:05 392 0
1 条回答
写回答
取消 提交回答
  • 请注意,“ ABC-CO”不能存储在varchar(3)字段中-您需要varchar(6)。

    如果只有--CO和-PR是后缀,则可以使用REPLACE函数:

    
    create table temp
    (
        date datetime,
        category varchar(6),
        amount money
    )
    
    insert into temp values ('1/1/2012', 'ABC-CO', 1000.00)
    insert into temp values ('2/1/2012', 'DEF', 500.00)
    insert into temp values ('2/1/2012', 'GHI-PR', 800.00)
    insert into temp values ('2/10/2012', 'DEF', 700.00)
    insert into temp values ('3/1/2012', 'ABC', 1100.00)
    
    
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(REPLACE(REPLACE(c.category, '-PR',''),'-CO',''))
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
    
    set @query = 'SELECT date, ' + @cols + ' from 
            (
                select date
                    , amount
                    , REPLACE(REPLACE(category, ''-PR'',''''),''-CO'','''') as category
                from temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '
    
    
    execute(@query)
    
    drop table temp
    
    2020-01-03 11:07:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载