2014-10-08 103 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。