SQL / Dynami c SQL - добавить столбец, если он не существует - PullRequest
1 голос
/ 07 января 2020

У меня есть запрос 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, если он не существует, затем добавить столбец JKL со значениями NULL, а затем ссылаться в операторе case?

1 Ответ

0 голосов
/ 08 января 2020

"столбцы" являются производными от значений поворотной категории. Просто вставьте фиктивные категории DEF, GHI, AB C для учетной записи с нулевой суммой. Эти нулевые значения не влияют на результат и генерируют столбцы DEF, GHI, AB C, если ни одна из учетных записей не имеет этих категорий.

..........................
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);
.........................
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...