当前位置: 首页 > 知识库问答 >
问题:

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

王曜文
2023-03-14

如何执行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个答案

尹俊雅
2023-03-14

如果您的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

请参阅演示。

 类似资料:
  • 我有一个产品类: 如果group是一个单独的字段,就像name一样,我可以这样做: 如何使用? 预期的结果如下所示,对于productList中存在的每个组,映射到在其字段中具有该组的产品列表

  • 问题内容: 我有一个包含时间戳名为RDD 时间 长整型: 我正在尝试按值1,值2和时间分组为YYYY-MM-DD。我尝试按演员分组(时间为日期),但随后出现以下错误: 这是否意味着无法按日期分组?我什至尝试添加另一级别的强制转换以将其作为字符串: 哪个返回相同的错误。 我已经读到我可以在RDD上使用gregationByKey,但我不明白如何在几列中使用它并将其转换为YYYY-MM-DD字符串。我

  • 问题内容: 我有如下数据 O / P就是这样。 我已尝试使用以下查询,但未成功,请提出建议。 得到了解决方案.. 从测试表中选择f1.id,f1.stat,f1.cdate作为F1加入(从stat从测试表组中选择stat,MAX(cdate)作为dt)作为F2在f2.stat= F1.stat和f2.dt = f1.cdate 问题答案: SELECT t1.id, t1.stat, t1.dat

  • 问题内容: 假设我有一个这样的列表: 我如何最优雅地将其分组以在Python中获得此列表输出: 因此,这些值按次值分组,但顺序保留下来。 问题答案:

  • 问题内容: 您好,我浏览了一段时间的论坛,并在这里问我的第一个问题。我有点束手无策,想知道是否能得到一些帮助。我正在使用Access 2007,但尚未在网上找到一个很好的答案。 我的数据是诊断代码和客户ID,而我正在寻找的原因就是为什么要为每个诊断代码找到不同的客户ID计数。理想情况下,在非Access SQL中,它看起来应该像这样: 我知道这是一个非常简单的问题,但是我发现的答案太复杂(多个聚合

  • 问题内容: 我有以下几点: http://sqlfiddle.com/#!6/226ae/1 我现在尝试为一年中的每个星期添加一行,并相应地过滤联系人。CONTACTS有一个datetime列。新表将如下所示: 我认为需要使用DATEADD,但是在如何开始更改查询方面我迷茫了。 我确实知道MySQL具有GROUP BY WEEK命令,但我认为SQL没有等效的命令。做到这一点的最佳方法是什么? 问题