在一个查询中计算每个月、每年的租金成本的平均值以及所有期间的平均值

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

在一次查询中计算每个月、每年的租金成本平均值以及所有期间的平均值。 按年排序结果,然后按月排序。 我尝试使用 ROLLUPCUBE。但是 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 正确限制每个聚合。