gpt4 book ai didi

sql - 动态运行总计

转载 作者:行者123 更新时间:2023-12-04 04:55:08 25 4
gpt4 key购买 nike

我想创建一个 View ,返回几个月的降雨量总计。 View 返回的每一行代表给定年份的一个月。

在 View 中,我想包括一列是一年中的累计降雨量,这样一月份的一行将包含该年一月份的总降雨量。 2 月的行将有 Jan+Feb 的总降雨量那年,Mar 的行将有降雨量总计 Jan+Feb+Mar ... 以此类推,直到 12 月。12 月将有全年的总降雨量。

困难的部分是我希望能够查询特定日期的 View
例如。 “select * from vw_rain_stats where rain_date >= to_date('2010-MAR-01') ”和累计总计列应该从 where 子句中指定的月份(三月)开始累计,而不是一月。

我不希望 View 返回的数据中包含 2010-MAR-01 之前的任何月降雨量。

我可以开发一个可以累计全年 amts 的 View ,但我无法弄清楚如何开发该 View ,以便它可以开始累计 1 月以外的其他月份的 amts。

鉴于基础表中有 2012 年 1 月至 2013 年 2 月的数据,并且该时间段内的每个月都有一些降雨(月降雨量为零)。

create table rain_stats (rain_date date, amt number);

insert into rain_stats values ('2012-JAN-01', 50);
insert into rain_stats values ('2012-FEB-01', 10);
insert into rain_stats values ('2012-MAR-01', 20);
insert into rain_stats values ('2012-APR-01', 40);
insert into rain_stats values ('2012-MAY-01', 30);
insert into rain_stats values ('2012-JUN-01', 10);
insert into rain_stats values ('2012-JUL-01', 4);
insert into rain_stats values ('2012-AUG-01', 100);
insert into rain_stats values ('2012-SEP-01', 5);
insert into rain_stats values ('2012-OCT-01', 100);
insert into rain_stats values ('2012-NOV-01', 90);
insert into rain_stats values ('2012-DEC-01', 80);
insert into rain_stats values ('2013-JAN-01', 30);
insert into rain_stats values ('2013-FEB-01', 7);

用户执行此查询
select * from vw_rain_stats where rain_date >= '2012-MAY-01'
这是返回的结果;

| RAIN_DATE | AMT |正在运行_AMT |
------------------------------------------
| 2012 年 5 月 1 日 | 30 | 30 |
| 2012 年 6 月 1 日 | 10 | 40 |
| 2012 年 7 月 1 日 | 4 | 44 |
| 2012 年 8 月 1 日 | 100 | 144 |
| 2012 年 9 月 1 日 | 5 | 149 |
| 2012 年 10 月 1 日 | 100 |第249话
| 2012 年 11 月 1 日 | 90 |第339话
| 2011 年 12 月 1 日 | 80 |第419话
| 2013 年 1 月 1 日 | 30 | 30 |
| 2013 年 2 月 1 日 | 70 | 100 |
| ...................... | ... | ..... |

请注意,2012 年 1 月至 4 月的降雨量不包括在结果集中或 running_amt 累积值中。这就是我想要发生的事情。

最佳答案

更新 你在找这个吗?

CREATE VIEW vw_rain_stats
AS
SELECT TRUNC(rain_date, 'MM') rain_date,
SUM(amt) amt
FROM rain_stats
GROUP BY TRUNC(rain_date, 'MM')
;

获取 2012 年的每月金额
SELECT rain_date,
amt,
SUM(amt) OVER (ORDER BY rain_date) running_amt
FROM vw_rain_stats
WHERE rain_date BETWEEN '01-JAN-12' AND '01-DEC-12';

获取从 2011 年 12 月开始的每月金额
SELECT rain_date,
amt,
SUM(amt) OVER (ORDER BY rain_date) running_amt
FROM vw_rain_stats
WHERE rain_date >= '01-DEC-11';

示例输出:

|          RAIN_DATE | AMT | RUNNING_AMT |
------------------------------------------
| December, 01 2011 | 80 | 80 |
| January, 01 2012 | 30 | 110 |
| February, 01 2012 | 70 | 180 |
| March, 01 2012 | 110 | 290 |
| .................. | ... | ........... |

这是 SQLFiddle 演示

关于sql - 动态运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com