#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
.