Получите сумму строк с помощью sql-запроса

#sql #oracle

Вопрос:

Предположим, у меня есть такая структура таблицы:

 CREATE TABLE TEST 
(
    X VARCHAR2(1),  -- firstName
    Y VARCHAR2(1),  -- lastName
    Z NUMBER(3),    -- quantity
    W VARCHAR2(1)   -- B=Buy or S=Sell 
);

INSERT INTO TEST(x, y, z, w) VALUES ('a', 'b', 3, 'S');
INSERT INTO TEST(x, y, z, w) VALUES ('a', 'b', 5, 'B'); -- sum of 3 S   5 B = 2 B
INSERT INTO TEST(x, y, z, w) VALUES ('c', 'd', 10, 'S');
INSERT INTO TEST(x, y, z, w) VALUES ('c', 'd', 2, 'B'); -- sum of 10 S   2 B = 8 S
 

Я хочу суммировать количество для одного и того же имени и фамилии и получить результат, как показано ниже

 X   Y   sum     W
------------------
a   b   2       B
c   d   8       S
 

Можно ли получить этот результат в одном SQL-запросе ?

легко получить SUM с GROUP BY помощью, но не нашел способа сохранить столбец «Покупка» и «Продажа» одновременно.

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

1. Пожалуйста, объясните логику для столбца W .

2. в столбце W указано, что это либо заказ на покупку, либо заказ на продажу для данного количества;

Ответ №1:

О, я понимаю. Я думаю, вам нужна агрегация с некоторой дополнительной условной логикой:

 select x, y,
       abs(sum(case when w = 'B' then z else - z end)) as sum,
       (case when sum(case when w = 'B' then z else - z end) >= 0
             then 'B' else 'S'
        end)
from test
group by x, y;
 

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

1. Да, это ответ на вопрос. Спасибо!