2013-03-31 76 views
1

請你幫我在下面。格式化日期以升序排列

我寫了下面的查詢按要求

SQL> SELECT mon."months", 
    2   COUNT (DECODE (e1.ename, 'RAVI', 1, DECODE (e1.ename, 'KIRAN', 1, NULL)) 
    3    ) AS "num-review" 
    4  FROM (SELECT  TO_CHAR (ADD_MONTHS (SYSDATE, LEVEL - 7), 
    5        'MON-YYYY' 
    6        ) "months" 
    7     FROM DUAL 
    8   CONNECT BY LEVEL <= 18 
    9    ORDER BY LEVEL) mon, (select ename, hiredate, to_char(hiredate,'MON-YYYY') "Month" from emp_copy) e1 
10    WHERE mon."months"=e1."Month"(+) 
11 GROUP BY "months"; 

months num-review 
-------- ---------- 
APR-2013   0 
AUG-2013   0 
DEC-2012   1 
DEC-2013   0 
FEB-2013   2 
FEB-2014   0 
JAN-2013   1 
JAN-2014   0 
JUL-2013   0 
JUN-2013   0 
MAR-2013   0 

months num-review 
-------- ---------- 
MAY-2013   0 
NOV-2012   0 
NOV-2013   0 
OCT-2012   1 
OCT-2013   0 
SEP-2012   1 
SEP-2013   0 

18 rows selected. 

這裏我得到的輸出喜歡

Sep-2012 
Oct-2012 
Nov-2012 
Dec-2012 
Jan-2013 
Feb-2013 
Mar-2013 
Apr-2013 
May-2013 
Jun-2013 
Jul-2013 
Aug-2013 
Sep-2013 
Oct-2013 
Nov-2013 
Dec-2013 
Jan-2014 
Feb-2014 

,但我得到的不同的方式輸出。任何人都可以幫我解決這個問題。

回答

1

由於您在日期上使用to_char以獲得「月」,因此按此排序只會按字母順序給出月份(如您所見)。您需要爲自己創造另一個按照時間順序排序的字段,您可以使用「YYYYMM」進行排序。並以此命令。以下是基於您的查詢的示例(簡化爲刪除特定的表格)。這有幫助嗎?

select "months", count(*) "num", "sort_months" from 
(
SELECT TO_CHAR (ADD_MONTHS (SYSDATE, LEVEL - 7), 'MON-YYYY') "months", 
     TO_CHAR (ADD_MONTHS (SYSDATE, LEVEL - 7), 'YYYYMM') "sort_months" 
FROM DUAL 
CONNECT BY LEVEL <= 18 
ORDER BY LEVEL 
) 
group by "months", "sort_months" 
order by "sort_months"; 
1

如果要排序的日期,根據MON-YYYY它會給給O/P從APR,AUG.. 因爲MON-YYYY會像APR-2013一些事情開始,它的字母順序排列的數據, 所以你也需要提取numeric月份的值,即MM-YYYY以及'MON-YYYY and sort with MM-YYYYY',那麼結果將是您的預期結果,即以排序方式的日期。

SELECT mon."months",COUNT (DECODE (e1.ename, 'RAVI', 1, DECODE (e1.ename, 'KIRAN', 1, NULL))) AS "num-review" 
FROM (SELECT TO_CHAR(ADD_MONTHS(SYSDATE, LEVEL - 7),'MON-YYYY') "months",TO_CHAR(ADD_MONTHS(SYSDATE, LEVEL - 7),'MM-YYYY') "months_num" 
     FROM DUAL CONNECT BY LEVEL <= 18 ORDER BY LEVEL) mon, 
    (select ename, hiredate, to_char(hiredate,'MON-YYYY') "Month" from emp_copy) e1 
    WHERE mon."months"=e1."Month"(+) 
    GROUP BY "months" order by "months_num";