Получить сумму для столбца на основе условия - PullRequest
2 голосов
/ 28 марта 2019

Я работаю над запросом SQL.Запрос выглядит примерно так:

Select 
    a.field1,
    b.field2,
    c.field3,
    c.field4,
    b.filed5,
    a.field6,
    d.field7 
from 
    a 
    Inner join b on a.field1 = b.field1 
    right join c on b.field2 = c.field3 
    left  join d on d.filed3 = a.field1 
where some conditions;

Вывод вышеизложенного будет выглядеть примерно так:

field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name   | value1 | other1 | 1      | diff   |   new  | 100
name1  | value2 | other2 | 1      | diff1  |   new1 | 100
name2  | value3 | other3 | 2      | diff2  |   new2 | 100

Поэтому мне нужен новый столбец в результате, который суммирует field7на основе значения field4 (если они одинаковые).

Возможно ли это в SQL?Я попытался использовать Group by field 4 здесь, но я получаю ошибку, что field1 должен использоваться в группе по.Поэтому я не могу получить ожидаемый результат.

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

field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name   | value1 | other1 | 1      | diff   |   new  | 200
some   | value3 | other3 | 2      | diff2  |   new2 | 100

В основном я хочу удалить один столбец на основе условия и суммировать последнее поле.

Любые предложения полезны.

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Чтобы вычислить сумму field7 в группах записей с одинаковым field4, вы можете использовать оконную функцию SUM(...) OVER(...).

Чтобы хранить только одну запись на группу записей с одинаковым field4, вы можете использовать ROW_NUMBER() во внутреннем запросе и отфильтровывать нежелательные записи во внешнем запросе. Обратите внимание, что вам нужен критерий сортировки , чтобы надежно выбрать, какую запись следует хранить в каждой группе. Я решил использовать field1 (измените его, как вам нужно):

Ваш (псевдо) запрос должен выглядеть так:

SELECT * FROM (
    SELECT 
        a.field1,
        b.field2,
        c.field3,
        c.field4,
        b.filed5,
        a.field6,
        SUM(d.field7) OVER(PARTITION BY c.field4) sm,
        ROW_NUMBER()  OVER(PARTITION BY c.field4 ORDER BY a.field1) rn,
    FROM
        a 
        INNER JOIN b on a.field1 = b.field1 
        RIGHT JOIN c on b.field2 = c.field3 
        LEFT  JOIN d on d.field3 = a.field1 
    WHERE some conditions
) x
WHERE rn = 1

Подсказка: вы можете выполнить внутренний запрос независимо, чтобы увидеть, что он возвращает (это помогает понять логику).

2 голосов
/ 28 марта 2019

Вы можете использовать разделение по запросу, чтобы создать отдельный раздел в соответствии с field4, а затем взять сумму

SELECT
z.* FROM (SELECT
a.field1,
b.field2,
c.field3,
b.filed5,
a.field6,
SUM(d.field4) OVER (PARTITION BY a.field1, b.field2, c.field3, b.filed5, a.field6) AS field7,
ROW_NUMBER() OVER (PARTITION BY c.field4 ORDER BY c.field4) AS rank FROM a INNER JOIN b
ON a.field1 = b.field1 RIGHT JOIN c
ON b.field2 = c.field3 LEFT JOIN d
ON d.filed3 = a.field1 where some conditions; ) z WHERE z.rank = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...