Разделение кредитов и дебетов на оси - PullRequest
0 голосов
/ 06 октября 2019

У меня есть следующий запрос:

DECLARE @cols AS varchar(8000) = ''
DECLARE @selectcols AS varchar(8000) = ''
DECLARE @query AS varchar(8000) = ''

SELECT @cols = @cols + QUOTENAME(Type) + ',' FROM (select distinct [Type] from #temp) as tmp order by Type
SELECT @cols = LEFT(@cols, LEN(@cols) - 1) 

SELECT @selectcols = @selectcols + 'ISNULL(' + QUOTENAME(Type) + ',0) as ' + QUOTENAME(Type) +',' FROM (select distinct Type from #temp) as tmp order by Type
SELECT @selectcols = LEFT(@selectcols, LEN(@selectcols) - 1) 

SET @query = 
'
select 
    PostDate,
    Status,
    Account,
    ' + @selectcols + '
from
    #temp
    pivot
    (
      sum(Amount)
      for Type in (' + @cols + ')
    ) p
'

EXECUTE (@query)

Он дает следующие результаты:

enter image description here

Что я 'Однако мне нужно сделать это для всех различных типов, это показать кредиты и дебеты в разных столбцах, то есть тип 1 (кредиты), тип 2 (дебеты), тип 1 (кредиты), тип 2 (дебеты) и т. д.

Я знаю, что мог бы сделать что-то похожее на это:

CASE WHEN amount >= 0 THEN amount
     ELSE NULL
END AS debit ,
CASE WHEN amount < 0 THEN amount
     ELSE NULL
END AS credit

Но я не уверен, как включить это в стержень. Как это можно сделать?

Тестовые данные

Create Table #temp
(
    Type varchar(50),
    Amount money,
    PostDate varchar(50),
    Status varchar(50),
    Account varchar(50)
)

insert into #temp
(
    Type,
    Amount,
    PostDate,
    Status,
    Account
)
select
    'Type 1',
    '296.60',   
    'September 2019',
    'Current',
    '6116'
union all
select
    'Type 1',   
    '-195.51',  
    'September 2019',   
    'Former',   
    '6116'
union all
select
    'Type 2',   
    '150.00',   
    'September 2019',   
    'Former',   
    '6113'
union all
select
    'Type 2',   
    '180.43',   
    'September 2019',   
    'Former',   
    '6113'
union all
select
    'Type 2',   
    '-1860.10', 
    'September 2019',   
    'Former',   
    '6113'
union all
select
    'Type 2',   
    '1644.11',  
    'September 2019',
    'Former',   
    '6113'
union all
select
    'Type 2',   
    '655.38',   
    'September 2019',   
    'Former',   
    '6113'
union all
select
    'Type 2',   
    '366.42',   
    'September 2019',   
    'Current',  
    '6113'
union all
select
    'Type 2',   
    '-403.92',  
    'September 2019',   
    'Former',   
    '6113'

1 Ответ

1 голос
/ 06 октября 2019

Не понимаю, зачем вам динамический SQL. В этом случае это выглядит как условное агрегирование:

select postdate, status, account,
       sum(case when type = 1 and amount > 0 then amount end) as type1_credit,
       sum(case when type = 1 and amount < 0 then amount end) as type1_debit,
       sum(case when type = 2 and amount > 0 then amount end) as type2_credit,
       sum(case when type = 2 and amount < 0 then amount end) as type2_debit
from #temp
group by postdate, status, account;

Конечно, если вы не знаете типы данных, вы можете адаптировать вышеприведенное к динамическому SQL.

...