由ajmalmhd04的精心佈置的回答一些輕微的變化。
這裏我們以TRUNC(anydate,'MONTH')的形式使用TRUNC(),它返回相關月份的第1天,它保留的數據類型比在大型數據集中處理字符串更快。
此外還使用ANSI連接語法。
-- full monthly range over 12 months
-- example, 12 months starting at Jan 1 current year
SELECT ADD_MONTHS(TRUNC(sysdate,'YEAR'),LEVEL) range_month
FROM dual
CONNECT BY level <= 12
- 收集基本數據
SELECT TO_CHAR(the_month,'yyyy-mm-dd') AS the_month, the_count
FROM (
SELECT TRUNC(my_date,'MONTH') AS the_month, COUNT(*) AS the_count
FROM t
GROUP BY TRUNC(my_date,'MONTH')
)
ORDER BY the_month
;
- 產生一個累積
SELECT
TO_CHAR(the_month,'yyyy-mm-dd') AS the_month
, the_count
, sum(the_count) over(order by the_month rows unbounded preceding) AS cumulative
FROM (
SELECT TRUNC(my_date,'MONTH') AS the_month, COUNT(*) AS the_count
FROM t
GROUP BY TRUNC(my_date,'MONTH')
)
ORDER BY the_month
;
- 用鹼數據結合範圍&累積由左外連接
SELECT
TO_CHAR(Y.range_month,'yyyy-mm-dd') AS the_month
, NVL(T.the_count,0) AS the_count
, sum(T.the_count) over(order by Y.range_month rows unbounded preceding) AS cumulative
FROM
(
SELECT ADD_MONTHS(TO_DATE('2014-01-01','yyyy-mm-dd'),LEVEL) range_month /* fixed date used for example only */
FROM dual
CONNECT BY level <= 12
) Y
LEFT OUTER JOIN (
SELECT TRUNC(my_date,'MONTH') AS the_month, COUNT(*) AS the_count
FROM t
GROUP BY TRUNC(my_date,'MONTH')
) T
ON Y.range_month = T.the_month
ORDER BY
Y.range_month
;
上述內容可能在this SQLfiddle demo查看。
輝煌,非常感謝! – 2014-08-28 05:47:44