SQL сумма сгруппирована по полю со всеми строками - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть эта таблица:

id  sale_id  price
-------------------
1     1       100
2     1       200
3     2       50 
4     3       50

Я хочу этот результат:

id  sale_id  price  sum(price by sale_id)
------------------------------------------
1     1       100    300
2     1       200    300
3     2       50      50
4     3       50      50

Я пробовал это:

SELECT id, sale_id, price, 
(SELECT sum(price) FROM sale_lines GROUP BY sale_id) 
FROM sale_lines

Но получите ошибку, что подзапрос возвращает различное количество строк. Как мне это сделать?

Я хочу, чтобы все строки таблицы sale_lines выбрали все поля и добавили сумму (цену), сгруппированную по sale_id.

Ответы [ 4 ]

3 голосов
/ 28 февраля 2020

Вы можете использовать функцию window :

sum(price) over (partition by sale_id) as sum

Если вы хотите подзапрос, то вам нужно сопоставить их:

SELECT sl.id, sl.sale_id, sl.price, 
       (SELECT sum(sll.price) 
        FROM sale_lines sll 
        WHERE sl.sale_id = sll.sale_id 
        ) 
FROM sale_lines sl;
2 голосов
/ 28 февраля 2020

Не используйте GROUP BY в подзапросе, сделайте его связанным подзапросом:

SELECT sl1.id, sl1.sale_id, sl1.price, 
       (SELECT sum(sl2.price) FROM sale_lines sl2 where sl2.sale_id = sl.sale_id) as total 
FROM sale_lines sl1
0 голосов
/ 28 февраля 2020
SELECT t1.*, 
       total_price 
FROM   `sale_lines` AS t1 
       JOIN(SELECT Sum(price) AS total_price, 
                   sale_id 
            FROM   sale_lines 
            GROUP  BY sale_id) AS t2 
         ON t1.sale_id = t2.sale_id 
0 голосов
/ 28 февраля 2020

Помимо других подходов, вы можете использовать CROSS APPLY и получить сумму.

SELECT id, sale_id,price, Price_Sum
FROM YourTable AS ot
CROSS APPLY
(SELECT SUM(price) AS Price_Sum
FROM YourTable
WHERE sale_id = ot.sale_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...