SQL условное сложение или вычитание - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть одна таблица, в которой мне нужно сделать простую математику на поле. Я пытался использовать вложенные операторы SELECTS, IF / THEN или CASE в SQL безрезультатно.

Пример таблицы:
wYear, yMonth, Account, Usage, Serv_code
2008, 9, 12345, 1000, банан
2008, 9, 12345, 5000, банан
2008, 9, 12345, 4000, Apple
2007, 5, 54321, 1500, Банан


Мне нужно сгруппировать по wYear, yMonth, Account и добавить «Использование», ГДЕ Serv_code = 'Banana' ...

ВЫБЕРИТЕ год, месяц, счет, СУММУ (использование) как "Итого"
ИЗ myTable
ГДЕ Serv_code = 'Банан'
GROUP BY год, месяц, счет

НО где я попал в стену - если «Serv_code» равен «Apple» (WHERE Serv_code = «Apple»), мне нужно вычесть «Apple» Usage из SUM (Usage).

ПРИМЕРЫ РЕЗУЛЬТАТОВ ИСПОЛЬЗОВАНИЯ ТАБЛИЦЫ ВЫШЕ:
2008, 9, 12345, 2000
2007, 5, 54321, 1500

Я хакер, когда дело доходит до SQL, и ответ прост как день, но это был один из тех дней.

Ответы [ 5 ]

1 голос
/ 16 сентября 2009
SELECT wYear, yMonth, Account, SUM(case when Serv_code  = 'Banana' then
Usage when Serv_Code = 'Apple' then -Usage else 0 end) as "Totals"
FROM myTable

GROUP BY wYear, yMonth, Account

Тестовая версия

Declare @myTable table (wYear int, ymonth int, Account varchar(20), 
Usage int, Serv_Code varchar(20))

Insert into @mytable values (2008, 9, '12345', 1000, 'Banana')
Insert into @mytable values (2008, 9, '12345', 5000, 'Banana')
Insert into @mytable values (2008, 9, '12345', 4000, 'Apple')
Insert into @mytable values (2007, 5, '54321', 1500, 'Banana')

SELECT wYear, yMonth, Account, SUM(case when Serv_code  = 'Banana' then
Usage when Serv_Code = 'Apple' then -Usage else 0 end) as "Totals"
FROM @myTable

GROUP BY wYear, yMonth, Account


wYear   yMonth  Account Totals
2007    5   54321   1500
2008    9   12345   2000
1 голос
/ 16 сентября 2009

Вы можете использовать оператор case, чтобы получить положительное или отрицательное значение в зависимости от значения в Serv_code:

select wYear, yMonth, Account, sum(Usage * case Serv_code when 'Apple' then -1 else 1 end) as "Totals"
from myTable
where Serv_code in ('Banana', 'Apple')
group by wYear, yMonth, Account
1 голос
/ 16 сентября 2009

Надеюсь, это то, что вы хотите:

SELECT 
    banana.wYear, 
    banana.yMonth, 
    banana.Account, 
    totals_banana - totals_apple AS totals
FROM
(
    SELECT wYear, yMonth, Account, SUM(Usage) as "totals_banana"
    FROM myTable 
    WHERE Serv_code = 'Banana'
    GROUP BY wYear, yMonth, Account
) banana
INNER JOIN 
(
    SELECT wYear, yMonth, Account, SUM(Usage) as "totals_apple"
    FROM myTable 
    WHERE Serv_code = 'Apple'
    GROUP BY wYear, yMonth, Account
) apple 
ON 
     banana.wYear = apple.wYear 
     AND banana.yMonth = apple.yMonth 
     AND banana.Account = apple.Account
0 голосов
/ 16 сентября 2009

Может быть, это может сработать -

ВЫБЕРИТЕ год, месяц, счет, SUM (случай, когда Usage = 'Apple', затем использование * -1, еще Usage end) как "Итоги" ИЗ myTable ГДЕ Serv_code = 'Банан' GROUP BY год, месяц, счет

0 голосов
/ 16 сентября 2009

Я сомневаюсь в его эффективности, но это должно сработать

SELECT 
    wYear, yMonth, Account, 
    (
      (SELECT SUM(Usage) FROM myTable AS m 
        WHERE m.wYear=wYear AND 
              m.yMonth=yMonth AND 
              m.Account=Account AND 
              m.Serv_code='Banana') -
      (SELECT SUM(Usage) FROM myTable AS m 
        WHERE m.wYear=wYear AND 
              m.yMonth=yMonth AND 
              m.Account=Account AND 
              m.Serv_code='Apple')
   ) as "Totals"
FROM myTable 
GROUP BY wYear, yMonth, Account
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...