微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每个给定列表的 SQL 分组/聚合

如何解决每个给定列表的 SQL 分组/聚合

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

id 数量 价格
1 10 1.5
2 5 2
3 8 2.5
4 20 1
5 3 4
6 4 5
7 1 7

并且想要查询给定另一个带有值的 table2

id
1
3
7

我想要一个结果表,将行分组到给定的 id。所以像

id 数量 总成本
1 10 15
3 23 45
7 51 104

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

解决方法

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

参见demo

,

您的表定义中有一些信息可能不明确,所以让我做几个假设:

我将假设 table1 和 table2 上的 id 字段具有不同的含义。我的意思是,表 1 上的 id 1 可能指的是订单的 ID,而表上的 id1 可能指的是客户、客户或供应商。

我会将 id 上的 table1 字段重命名为 "order_id",因为这看起来像是一个包含订单的表格,可能是客户的订单。同时,我将添加一个字段customer_id。此字段对应于 table2 中的 id 字段,我们也将对其进行重命名。

所以 table1 最终是:

order_id |数量 |价格 |客户ID 1 | 10 | 1.5 | 7 2 | 5 | 2 | 3 3 | 8 | 2.5 | 1 4 | 20 | 1 | 1 5 | 3 | 4 | 3 6 | 4 | 5 | 3 7 | 1 | 7 | 7

和 table2 是:

customer_id 1
3 7

现在我们可以通过客户 ID 绑定两个表并执行:

select customer_id,sum(quantity) as total_quantity,sum(price) as total_price from table1 left join table2 on table1.customer_id=table2.customer_id group by customer_id.

如果我误解了您的意图,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?