【发布时间】:2013-07-13 22:03:51
【问题描述】:
我有一个复杂的查询(包含多个联接、联合),它返回一组包含 id、day、hr、amount 的行。查询的输出如下所示:
id day hr amount
1 1 1 10
1 1 2 25
1 1 3 30
1 2 1 10
1 2 2 40
1 2 2 30
2 1 1 10
2 1 2 15
2 1 3 30
2 2 1 10
2 2 2 20
2 2 2 30
我需要为一天中的每个小时找到每个 ID 的累积总数。输出应该是这样的:
id day hr amount cumulative total
1 1 1 10 10
1 1 2 25 35
1 1 3 30 65
1 2 1 10 10
1 2 2 40 50
1 2 2 30 80
2 1 1 10 10
2 1 2 15 25
2 1 3 30 55
2 2 1 10 10
2 2 2 20 30
2 2 2 30 60
产生第一个输出的初始查询如下所示:
select id, day, hr, amount from
( //multiple joins on multiple tables)a
left join
(//unions on multiple tables)b
on a.id=b.id;
获取第二个输出中描述的累积总和的 sql 查询是什么?解决方案中不应使用 SET。
谢谢。
【问题讨论】:
-
在更复杂(但可能)的解决方案之前:您是否考虑过 (a)
WITH ROLLUP是否足以满足您的需求,以及 (b) 在应用程序代码中而不是 SQL 中更容易实现这一点? -
@Wrikken: a) WITH ROLLUP 在输出中添加了额外的行,我需要以列的形式,是否可以使用 WITH ROLLUP 来实现? b) 我同意它在应用程序代码中会更简单,但我面临必须在 SQL 本身中完成的情况。
-
我会使用这样的存储过程:1. 使用查询结果创建一个临时表,2. 向临时表添加一列,3. 更新每一行带有累积总和的临时表。
-
您以这种方式提出的问题“我需要为一天中的每个小时查找每个 id 的累积总数”不是表格显示的内容。您的样本输出中有两次 ID 1、DAY 2、HR 2。在不使用变量的情况下似乎无法以这种方式解决它,因为您实际上并没有在该表中使用主键。
-
“重复问题”提供的答案不足;这些答案中的查询不会产生此问题中指定的结果集。 (一个大问题是这些查询不会为每个组生成一个运行总计,而是为下一个组重置它,如本问题中所述。这些查询只为整个集合生成一个运行总计。这是一个明显不同的问题。
标签: mysql sql join cumulative-sum