Рассчитайте СУММУ на основе типа CR — DR Trans

#sql #sql-server #tsql

Вопрос:

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

 BranchCode | AccountNo | TransType | TransAmount
    ABC123 |    001    |   CR      |    1000
    ABC123 |    002    |   CR      |    5000
    ABC123 |    001    |   CR      |    3000
    ABC123 |    001    |   DR      |    2000
    ABC567 |    001    |   CR      |    8000
    ABC567 |    002    |   CR      |    7000
    ABC123 |    002    |   DR      |    1000
    ABC567 |    002    |   DR      |    9000
 

Я хочу, чтобы результат был таким, как показано ниже

 BranchCode | AccountNo | BalanceType | BalanceAmount_CR| BalanceAmount_DR
  ABC123   |    001    |     CR      |   2000          |     0.00
  ABC123   |    002    |     CR      |   4000          |     0.00
  ABC567   |    001    |     CR      |   8000          |     0.00 
  ABC567   |    002    |     DR      |   0.00          |     2000
 

Я пробовал несколько способов, включая ПОВОРОТ, ЛЕВОЕ СОЕДИНЕНИЕ, ИСПОЛЬЗУЯ ОДНУ и ТУ же ТАБЛИЦУ, но каждый раз мой набор результатов отличается.

Одним из способов, которым я пытался

 SELECT  
 BranchCode 
,AccountNo
,(CASE 
        WHEN TransType='CR' THEN (SUM(TransAmount)) END)  AS BalanceAmount_CR
,(CASE 
        WHEN TransType='DR' THEN (SUM(TransAmount)) END)  AS BalanceAmount_DR
 
FROM TransTable 
GROUP BY  BranchCode,AccountNo,TransType
 

Когда я добавляю ТрансТайп в группу по, он создает новую строку и вычисляет сумму, мне просто нужна одна строка для каждого типа транзакции

P.S. Это не какой-то школьный проект, у меня сложная структура таблиц, но я упростил свою проблему, чтобы ее было легко понять.

Заранее спасибо.

Комментарии:

1. обновлено .пожалуйста, проверьте

2.Пожалуйста, прочтите это, чтобы получить несколько советов по улучшению вашего вопроса. Некоторое объяснение помогло бы, например, как 1000 3000 = 2000 для ABC123 / 001 BalanceAmount_CR и почему BalanceAmount_DR ноль для этой выходной строки. Ты действительно этого хочешь group by TransType ? Откуда это BalanceType берется?

Ответ №1:

Я решил сам. Просто опубликуйте ответ, если кто-то захочет знать.

 SELECT  
 BranchCode 
,AccountNo
,SUM(CASE 
        WHEN TransType='CR' THEN (TransAmount) END)  AS BalanceAmount_CR
,SUM(CASE 
        WHEN TransType='DR' THEN (TransAmount) END)  AS BalanceAmount_DR
 
FROM TransTable 
GROUP BY  BranchCode,AccountNo
 

Я только что переместил функцию SUM.

Комментарии:

1. Это совершенно не то, о чем вы просили в своем ожидаемом результате

2. BalanceType Столбец результата отсутствует. Явно не то, что просил ОП, как вы должны знать.

Ответ №2:

Похоже, на самом деле вы не хотите группироваться TransType . То, что вы, похоже, делаете, — это вычисляете общий баланс CR-DR , а затем разделяете положительные и отрицательные стороны на разные столбцы.

Вы можете сделать это с помощью производной таблицы:

 SELECT 
 BranchCode 
,AccountNo
,CASE WHEN BalanceAmount < 0 THEN 'DR' ELSE 'CR' END AS BalanceType
,CASE WHEN BalanceAmount >= 0 THEN BalanceAmount ELSE 0 END AS BalanceAmount_CR
,CASE WHEN BalanceAmount < 0 THEN -BalanceAmount ELSE 0 END AS BalanceAmount_DR
FROM (
    SELECT  
     BranchCode 
    ,AccountNo
    ,SUM(CASE WHEN TransType='CR' THEN TransAmount END) -
      SUM(CASE WHEN TransType='DR' THEN TransAmount END) AS BalanceAmount
    FROM TransTable 
    GROUP BY  BranchCode,AccountNo
) AS t
 

Вы также можете поместить его в CTE или использовать кучу CASE выражений в SELECT .