提问者:小点点

按给定列表进行SQL分组/聚合


如何执行SQL查询以根据特定列的给定值对行进行分组。例如,假设我们有一个表1

id | quantity |  price
1  |    10    |    1.5
2  |    5     |    2
3  |    8     |    2.5
4  |    20    |    1
5  |    3     |    4
6  |    4     |    5
7  |    1     |    7

并且希望得到另一个带有值的表2的查询

id 
1   
3 
7 

并且我希望有一个结果表,对给定ID之前的行进行分组。所以像这样的事情

id | total quantity |  total cost
1  |    10          |    15
3  |    23          |    45
7  |    51          |    104

不确定是否应该称之为分组,它更像是一个从开始到特定行/ID的连接/聚合结果。


共1个答案

匿名用户

如果您的MySql版本为8.0+,请使用sum()窗口函数:

SELECT *
FROM (
  SELECT id, 
         SUM(quantity) OVER (ORDER BY id) total_quantity,
         SUM(quantity * price) OVER (ORDER BY id) total_cost
  FROM table1
) t  
WHERE id IN (SELECT id FROM table2)

对于以前的版本,您可以通过连接和聚合来实现:

SELECT t2.id, 
       SUM(t1.quantity) total_quantity, 
       SUM(t1.quantity * t1.price) total_cost
FROM table2 t2 
INNER JOIN table1 t1 ON t1.id <= t2.id
GROUP BY t2.id
ORDER BY t2.id

请参阅演示。