在一个查询中计算每个月、每年的租金成本的平均值以及所有期间的平均值
Calculate average values of rentals cost in every month, every year and average across all periods, in one query
在我的讲座中,我把这个作为问题。我也看不懂。
select
"CUSTID",
"CARID",
"RENTALDATE",
"RETURNDATE",
"COST"
from
"RENTALS";
CUSTID CARID RENTALDATE RETURNDATE COST
1 8 10-DEC-10 17-DEC-10 265
1 13 16-NOV-08 21-NOV-08 264
1 16 30-MAY-10 05-JUN-10 275.95
2 8 21-APR-11 23-APR-11 100
2 8 21-JUN-11 25-JUN-11 150
4 20 21-JUL-11 23-JUL-11 220
4 25 12-JUL-10 19-JUL-10 433.99
5 15 24-FEB-11 26-FEB-11 145
5 15 16-MAR-11 21-MAR-11 324.56
5 15 01-MAY-11 03-MAY-11 90
7 11 23-MAY-10 25-MAY-10 157
8 5 23-MAY-10 25-MAY-10 143.44
8 25 28-FEB-11 04-MAR-11 326
11 3 20-OCT-10 25-OCT-10 366
11 6 12-DEC-08 16-DEC-08 245.98
11 13 31-JAN-11 02-FEB-11 261
13 13 26-MAR-09 29-MAR-09 204.89
14 20 08-JUL-10 09-JUL-10 158
15 23 14-SEP-09 15-SEP-09 75
Database rental table
在一次查询中计算每个月、每年的租金成本平均值以及所有期间的平均值。
按年排序结果,然后按月排序。
我尝试使用 ROLLUP
和 CUBE
。但是 0 知道该怎么做。
我不熟悉 Oracle 的 SQL 风格,但正如@Benson_YoureFired 所暗示的那样,您应该能够通过对值进行分组来完成此操作。我之前在 MySQL 中使用 DATETIME
列(格式为 YYYY-MM-DD HH-MM-SS
)完成了此操作。类似的东西在 Oracle 中应该是可能的。
SELECT SUBSTR(RENTALDATE, 7, 8) as date_range, SUM(COST)
FROM RENTALS
GROUP BY SUBSTR(RENTALDATE, 7, 8)
UNION
SELECT SUBSTR(RENTALDATE, 3, 5) as date_range, SUM(COST)
FROM RENTALS
GROUP BY SUBSTR(RENTALDATE, 3, 5)
这将 return 汇总的年份,然后是汇总的月份,如下所示:
2008 509.98
2009 204.89
2010 1799.38
2011 1616.56
2008-11 264.00
2008-12 245.98
2009-03 204.89
2010-05 576.39
2010-07 591.99
2010-10 366.00
2010-12 265.00
2011-01 261.00
2011-02 471.00
2011-03 324.56
2011-04 100.00
2011-05 90.00
2011-06 150.00
2011-07 220.00
再次提醒,我是从 MySQL 翻译过来的,所以 syntax/functions/keywords 可能不正确。
本质是 substr
函数以及 MySQL 在某些情况下如何将其 DATETIME
值视为字符串。这允许 GROUP BY
正确限制每个聚合。
在我的讲座中,我把这个作为问题。我也看不懂。
select
"CUSTID",
"CARID",
"RENTALDATE",
"RETURNDATE",
"COST"
from
"RENTALS";
CUSTID CARID RENTALDATE RETURNDATE COST
1 8 10-DEC-10 17-DEC-10 265
1 13 16-NOV-08 21-NOV-08 264
1 16 30-MAY-10 05-JUN-10 275.95
2 8 21-APR-11 23-APR-11 100
2 8 21-JUN-11 25-JUN-11 150
4 20 21-JUL-11 23-JUL-11 220
4 25 12-JUL-10 19-JUL-10 433.99
5 15 24-FEB-11 26-FEB-11 145
5 15 16-MAR-11 21-MAR-11 324.56
5 15 01-MAY-11 03-MAY-11 90
7 11 23-MAY-10 25-MAY-10 157
8 5 23-MAY-10 25-MAY-10 143.44
8 25 28-FEB-11 04-MAR-11 326
11 3 20-OCT-10 25-OCT-10 366
11 6 12-DEC-08 16-DEC-08 245.98
11 13 31-JAN-11 02-FEB-11 261
13 13 26-MAR-09 29-MAR-09 204.89
14 20 08-JUL-10 09-JUL-10 158
15 23 14-SEP-09 15-SEP-09 75
Database rental table
在一次查询中计算每个月、每年的租金成本平均值以及所有期间的平均值。
按年排序结果,然后按月排序。
我尝试使用 ROLLUP
和 CUBE
。但是 0 知道该怎么做。
我不熟悉 Oracle 的 SQL 风格,但正如@Benson_YoureFired 所暗示的那样,您应该能够通过对值进行分组来完成此操作。我之前在 MySQL 中使用 DATETIME
列(格式为 YYYY-MM-DD HH-MM-SS
)完成了此操作。类似的东西在 Oracle 中应该是可能的。
SELECT SUBSTR(RENTALDATE, 7, 8) as date_range, SUM(COST)
FROM RENTALS
GROUP BY SUBSTR(RENTALDATE, 7, 8)
UNION
SELECT SUBSTR(RENTALDATE, 3, 5) as date_range, SUM(COST)
FROM RENTALS
GROUP BY SUBSTR(RENTALDATE, 3, 5)
这将 return 汇总的年份,然后是汇总的月份,如下所示:
2008 509.98
2009 204.89
2010 1799.38
2011 1616.56
2008-11 264.00
2008-12 245.98
2009-03 204.89
2010-05 576.39
2010-07 591.99
2010-10 366.00
2010-12 265.00
2011-01 261.00
2011-02 471.00
2011-03 324.56
2011-04 100.00
2011-05 90.00
2011-06 150.00
2011-07 220.00
再次提醒,我是从 MySQL 翻译过来的,所以 syntax/functions/keywords 可能不正确。
本质是 substr
函数以及 MySQL 在某些情况下如何将其 DATETIME
值视为字符串。这允许 GROUP BY
正确限制每个聚合。