没有从Oracle查询获得所需的格式

时间:2013-12-19 05:12:48

标签: oracle10g

我正在尝试以下面的格式从数据库中获取数据,

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

任何人都可以帮助我获得所需格式的数据。

2 个答案:

答案 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 

SQLFiddle demo

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');