假设以下情况:
此信息存储在以下类型的恢复表中:
RESUME_TABLE:
WEEK | TOTAL_NEW | TOTAL_SOLVED
1 | 10 | 3
2 | 13 | 15
3 | 6 | 7我很难构建一个查询来获得以下结果:
REPORT_TABLE:
WEEK | PREV_TOTAL | NEW_CASES | SOLVED_CASES | NEW_TOTAL
1 | 0 | 10 | 3 | 7
2 | 7 | 13 | 15 | 5
3 | 5 | 6 | 7 | 4这个想法看起来很琐碎,NEW_TOTAL = PREV_TOTAL + NEW_CASES - SOLVED_CASES,尽管我一直在为将PREV_TOTAL带到下一行的想法而苦苦挣扎。
我试图使用RESUME表(Oracle11g)上的一个视图来完成这个任务。
有人能帮我做一些示例代码吗?
发布于 2012-09-12 04:57:27
非常简单和简洁的分析功能:
12:57:06 HR@vm_xe> l
1 select week
2 ,lag(total_cases_by_now - total_solved_by_now) over (order by week) prev_total
3 ,total_new new_cases
4 ,total_solved solved_cases
5 ,total_cases_by_now - total_solved_by_now new_total
6 from (
7 select week
8 ,total_new
9 ,total_solved
10 ,sum(total_new) over(order by week asc) as total_cases_by_now
11 ,sum(total_solved) over (order by week asc) as total_solved_by_now
12 from resume_table
13* )
12:57:07 HR@vm_xe> /
WEEK PREV_TOTAL NEW_CASES SOLVED_CASES NEW_TOTAL
---------- ------------ ---------- ------------ ----------
1 10 3 7
2 7 13 15 5
3 5 6 7 4
3 rows selected.
Elapsed: 00:00:00.01 发布于 2012-09-12 04:51:34
您可以使用模型子句来解决这个问题:
with resume_table as
(
select 1 week, 10 total_new, 3 total_solved from dual union all
select 2 week, 13 total_new, 15 total_solved from dual union all
select 3 week, 6 total_new, 7 total_solved from dual
)
select week, prev_total, total_new, total_solved, new_total
from resume_table
model
dimension by (week)
measures (total_new, total_solved, 0 prev_total, 0 new_total)
rules sequential order
(
new_total[any] order by week =
nvl(new_total[cv(week)-1], 0) + total_new[cv()] - total_solved[cv()]
,prev_total[any] order by week = nvl(new_total[cv(week)-1], 0)
)
order by week;尽管这使得人们认为周总是一个连续的数字。如果这不是真的,您将需要添加一个row_number()。否则,-1可能不会引用前一个值。
看这个SQL Fiddle。
发布于 2012-09-12 03:42:48
在RESUME_TABLE中添加一列(或创建一个视图,我认为这可能更好):
RESUME_LEFT
WEEK | LEFT
1 | 7
2 | -2
3 | -1就像这样:
CREATE VIEW resume_left
(SELECT week,total_new-total_solved "left" FROM resume_table)所以在REPORT_TABLE中,您可以有这样的定义:
PREV_TOTAL=(SELECT sum(left) FROM RESUME_LEFT WHERE week<REPORT_TABLE.week)编辑
好的,这个视图是不必要的:
PREV_TOTAL=(SELECT sum(total_new)-sum(total_solved)
FROM resume_table
WHERE week<REPORT_TABLE.week)https://stackoverflow.com/questions/12380640
复制相似问题