如何解决每个给定列表的 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 |
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 举报,一经查实,本站将立刻删除。