SQL / Dynamic SQL-如果不存在则添加列

问题描述 投票:1回答:1

我下面有SQL查询:

create table #temp
(
Account varchar(5),
category varchar(6),
amount money
)

insert into #temp values ('A001', 'ABC-CO', 1000.00)
insert into #temp values ('A002', 'DEF-CR', 500.00)
insert into #temp values ('A002', 'GHI-PR', 800.00)
insert into #temp values ('A003', 'DEF', 700.00)
insert into #temp values ('A004', 'ABC-PR', 1100.00)


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

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

set @query = 'SELECT Account, ' + @cols + ', (case when DEF is not NULL and GHI is not NULL then 1 
                                        when ABC is not NULL then 1
                                        else 0 end) as Outcome from 
    (
        select Account
            , amount
            , REPLACE(REPLACE(REPLACE(category, ''-PR'',''''),''-CO'',''''),''-CR'','''') as 
category
        from #temp 
   ) x
    pivot 
    (
         max(amount)
        for category in (' + @cols + ')
    ) p '


execute(@query)

drop table #temp

哪个生成下表:

 Account    ABC      DEF     GHI        Outcome
 A001       1000.00  NULL    NULL       1
 A002       NULL     500.00  800.00     1
 A003       NULL     700.00  NULL       0
 A004       1100.00  NULL    NULL       1

我的问题是case语句是基于已知关系建立的,其中某些列未出现在查询中。

例如,如果我添加到case语句中:

case when DEF is not NULL and JKL is not NULL then 1

所需的输出是因为JKL不存在,所以为0。

由于JKL不存在,因此查询错误。如何编辑上面的代码以查看JKL列的表,如果不存在,则添加具有NULL值的JKL列,然后引用case语句?

sql sql-server dynamic-sql
1个回答
0
投票

“列”从透视的类别值得出。只需为金额为NULL的帐户插入虚拟DEF,GHI,ABC类别即可。这些空值不会影响结果,并且如果没有一个帐户具有这些类别,则将生成DEF,GHI,ABC列。

..........................
insert into #temp values ('A004', 'ABC-PR', 1100.00)


insert into #temp(Account, category, amount)
select a.Account, c.category, null
from
(
select top (1) Account from #temp
) as a 
cross join (values('DEF'), ('GHI'), ('ABC'), ('JKL')) AS c(category);

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX);
.........................
© www.soinside.com 2019 - 2024. All rights reserved.