我正在尝试以下面的格式从数据库中获取数据,
Month Count
----- -----
201208 124
201209 0
201210 56
201211 25
201212 0
201301 184
201302 0
在数据库中,我有像
这样的条目Month Count
----- -----
201206 56
201208 124
201210 56
201211 25
201301 184
201304 49
以下是我的查询,
SELECT MONTH, Count
FROM TABLE_NAME
WHERE MONTH BETWEEN 201208 AND 201302
AND ID = 'X'
输出:
Month Count
----- -----
201208 124
201210 56
201211 25
201301 184
任何人都可以帮助我获得所需格式的数据。
答案 0 :(得分:1)
首先,您应该在这些日期之间生成完整月份的序列。您可以在Oracle中使用CONNECT BY LEVEL执行此操作。然后用你的桌子加入这个序列:
SELECT MonthSeq.MONTH,
NVL(Count,0) Count
FROM TABLE_NAME
RIGHT JOIN
(
SELECT
TO_CHAR(ADD_MONTHS(TO_DATE('201208','YYYYMM'),
(ROWNUM-1))
,'YYYYMM') MONTH
FROM DUAL
CONNECT BY LEVEL<=
MONTHS_BETWEEN(TO_DATE('201302','YYYYMM') ,
TO_DATE('201208','YYYYMM'))+1
) MonthSeq
ON TABLE_NAME.MONTH=MonthSeq.MONTH
ORDER BY MonthSeq.MONTH
UPD:
您对评论的查询应如下所示。您应该将WHERE条件移动到JOIN ON。如果您在WHERE中使用它,则不会获得零计数的行。
SELECT MonthSeq.MONTH,
NVL(SUM(TOTAL_SESSIONS),0) AS SESSIONS
FROM X
RIGHT JOIN
(
SELECT
TO_CHAR(ADD_MONTHS(TO_DATE('201208','YYYYMM'),
(ROWNUM-1))
,'YYYYMM') MONTH
FROM DUAL
CONNECT BY LEVEL<=
MONTHS_BETWEEN(TO_DATE('201302','YYYYMM') ,
TO_DATE('201208','YYYYMM'))+1
) MonthSeq
ON X.MONTH=MonthSeq.MONTH and X.acct_id = 'ABCD'
ORDER BY MonthSeq.MONTH
答案 1 :(得分:0)
您需要使用TO_DATE
函数将月份字段转换为DATE
格式。有关详细信息,请参阅here。试试这样,
SELECT TO_CHAR(TO_DATE(MONTH, 'YYYYMM'), 'YYYYMM') month, count
FROM TABLE_NAME
WHERE month BETWEEN TO_DATE('201208', 'YYYYMM') AND TO_DATE('201302', 'YYYYMM')
AND id = 'X'
ORDER BY TO_DATE(month, 'YYYYMM');