按字段分组的SQL求和所有行

3

我有这个表格:

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

I want this result:

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分组的price总和。

4个回答

4
你可以使用 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
哪个更有效率?似乎使用分区会更好?谢谢! - Marc Pont
2
@slayerbleast. . . 窗口函数相对于子查询来说运行速度更快,因为它不需要再次调用表。 - Yogesh Sharma

3

不要在子查询中使用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

1

除了其他方法,您可以使用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);

1
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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接