[英]Order By month and year in ORACLE with sum
我有一个存储过程,而select语句是:
SELECT COUNT(IDENTIFIER) AS TOTALORDER,SUM(FT.ACTUALORDER01+FT.ACTUALORDER02+FT.ACTUALORDER03+FT.ACTUALOR DER04) AS TOTALORDER,
SUM(TOTALPENDING) AS PENDING,
TO_CHAR(TO_DATE(DATE),'MonthYYYY') AS "Month-Year"
FROM FTORDER FT FULL JOIN FSDPENDING FS
ON FS.IDENTIFIER=FT.ORDERNUMBER
AND FT.ORDERDATE=FS.ORDERDATETIME
AND FT.ORDREcode=FS.ORDERcode
AND FT.sequence=FS.sequence
AND FT.recordstatus=FS.recordstatus
WHERE TRUNC(FORDERDATETIME) BETWEEN TO_DATE('01-JAN-2014','dd/mon/yyyy') AND TO_DATE('31-DEC-2015','dd/mon/yyyy')
AND TORDERNUMBER NOT LIKE ('-%')
GROUP BY TO_CHAR(TO_DATE(DATE),'MonthYYYY')
ORDER BY "Month-Year"
;
这显示了每个月的总和,但是我需要按月和年对结果进行排序,因为结果如下所示:
April 2013
February 2013
January 2013
June 2013
March 2013
May 2013
在这种情况下有什么解决方案?
将您的to_date的格式更改为(YYYY-MM),然后以此顺序(DESC或ASC)进行排序,以按照您想要的顺序进行获取。 目前,它是根据月份名称按字母顺序排序的。
TO_CHAR(TO_DATE(DATE),“月YYYY”)
有几件事不正确。
切勿在DATE列上应用TO_DATE 。 它迫使Oracle:
基于特定于语言环境的NLS设置 。 您需要TO_DATE将文字转换为日期。 对于date-arithmetic ,请保留原样的日期。
您当前正在对字符串进行排序,因为TO_CHAR将日期转换为字符串。
您可以这样做:
SQL> alter session set nls_date_format = 'YYYY-MON-DD';
Session altered.
SQL> SELECT TRUNC(hiredate,'MONTH')
2 FROM emp
3 GROUP BY TRUNC(hiredate,'MONTH')
4 ORDER BY TRUNC(hiredate,'MONTH');
TRUNC(HIRED
-----------
1980-DEC-01
1981-FEB-01
1981-APR-01
1981-MAY-01
1981-JUN-01
1981-SEP-01
1981-NOV-01
1981-DEC-01
1982-JAN-01
1982-DEC-01
1983-JAN-01
11 rows selected.
注意:alter session语句仅以所需格式显示日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.