Создание нового столбца для -ve значений из существующих строк - PullRequest
0 голосов
/ 17 апреля 2019

Как написать логику для этого в SQL Server:

Voucher #   Name   Amount 
-------------------------
 123        ABC     910
 123        ABC    -910
 224        XYZ     600

Ожидаемый результат

Voucher #    Name     Amount   - (Amount)
-------------------------------------------
 123         ABC       910       -910
 224         XYZ       600         -

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Использование условного агрегирования здесь действительно просто.Нет необходимости запрашивать одну и ту же таблицу снова и снова.

select Voucher
    , Name
    , Amount = sum(case when Amount > 0 then Amount else 0 end)
    , [-Amount] = sum(case when Amount < 0 then Amount else 0 end)
from YourTable
group by Voucher
    , Name
0 голосов
/ 17 апреля 2019

Если для каждого (Voucher, Name) существует только 1 положительный Amount и 0 или 1 отрицательный Amount, то с самостоятельным соединением:

select t.*, tt.amount NegativeAmount
from tablename t left join tablename tt 
on tt.voucher = t.voucher and tt.name = t.name and tt.amount < 0
where t.amount > 0 

См. Демоверсию .
Результаты:

> voucher | name | amount | NegativeAmount
> ------: | :--- | -----: | -------------:
>     123 | ABC  |    910 |           -910
>     224 | XYZ  |    600 |           
0 голосов
/ 17 апреля 2019

Вот код, попробуйте Сгруппируйте по отрицательной и положительной сумме и сделайте левое соединение

DECLARE @tbl TABLE
(
    Voucher varchar(10),
    Name    varchar(100),
    Amount  int 
)

INSERT INTO @tbl
(
    Voucher,
    Name,
    Amount
)
VALUES
(123,'ABC',910),
(123,'ABC',-910),
(224,'XYZ',600)

SELECT t1.Voucher, t1.Name, t1.Amount , ISNULL(t2.Amount,0) AS [(-Amount)] FROM (
SELECT t.Voucher, Name, Sum(t.Amount) Amount 
FROM @tbl t
WHERE t.Amount > 0
GROUP BY t.Voucher, t.Name) t1 Left JOIN 
(SELECT t.Voucher, Name, Sum(t.Amount) Amount 
FROM @tbl t
WHERE t.Amount < 0
GROUP BY t.Voucher, t.Name) t2 ON t1.Voucher = t2.Voucher
...