2014-10-08 95 views
0

我有这样的查询(甲骨文):集团按月份选择查询

例:

SELECT TO_DATE(TO_CHAR(CREATIONDATE, 'MM.YYYY'), 'MM.YYYY') as month, 
SUM(count(*)) over (order by to_date(TO_CHAR(CREATIONDATE, 'MM.YYYY'),'MM.YYYY')) as total 
FROM person 
GROUP BY TO_DATE(TO_CHAR(CREATIONDATE, 'MM.YYYY'), 'MM.YYYY') 

它通过一个月,以正确的顺序计算的人数,团体。 01.2014,02.2014,...,01.2015。 02.2015,...

它的工作,但:

  1. 有没有更好的办法做到这一点?
  2. 我需要为Oracle,Sql-Server和PostGre SQL提供单个查询。有没有办法做到这一点?我可以用在与string.replace我的应用程序稍微修改查询..
+0

为了澄清,您希望使用与Oracle,SQL Server和Postgres一起使用的同一个sytax的单个查询? – Tanner 2014-10-08 09:03:30

+0

是的,我想知道这是否可能,至少在我的应用程序在运行时的小修改String.Replace – user3544117 2014-10-08 09:18:24

+0

检查我的答案。我只考虑Oracle。 – 2014-10-08 09:31:10

回答

1

的部分to_date(TO_CHAR(CREATIONDATE, 'MM.YYYY'),'MM.YYYY')是在Analytic windowGroup by表达不必要的。而且,为什么在选择中将字面量再次转换为日期?您只需使用TO_CHAR即可显示所需的格式。

检查:

SQL> WITH DATA AS 
    2 (SELECT SYSDATE dt FROM dual CONNECT BY LEVEL< 11 
    3 ) 
    4 SELECT TO_CHAR(dt,'MM.YYYY') dt, 
    5 SUM(COUNT(*)) over (order by dt) cnt 
    6 FROM DATA 
    7 GROUP BY dt 
    8/

DT    CNT 
------- ---------- 
10.2014   10 

SQL> 
+0

谢谢!事实上,我为其他原因添加了TO_DATE ...(在我使用查询的报告软件中,我的查询顺序不起作用)。但是,如果有办法做到这一点,我仍然在寻找所有数据库的单个查询... – user3544117 2014-10-08 09:34:41

+0

我没有其他数据库来验证,我也不知道其他数据库的任何语法。我是一名贫穷的Oracle开发人员。 – 2014-10-08 09:40:21

1

我不认为有跨越三个数据库兼容的日期函数。你可以近似于:

select month(creationdate) as mon, year(creationdate) as yr, 
     sum(count(*)) over (order by min(creationdate)) as total 
from person 
group by month(creationdate), year(creationdate); 

上述工作在Oracle和SQL Server中。对于Postgres,您可以轻松定义month()year()函数。

您可以使用您的版本或在上述版本中使用extract(month from creationdate), extract(year from creationdate)用于Postgres和Oracle。