2014-10-08 5 views
0

У меня есть этот запрос (для Oracle):Group в месяц в запросе на выборку

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

Он подсчитывает количество людей, группы в месяц и в правильном порядке:

Ex. 01.2014, 02.2014, ..., 01.2015. 02,2015 ...

Это работает, но:

  1. Есть ли лучший способ сделать это?
  2. Мне нужен один запрос для Oracle, Sql-Server и PostGre SQL. Есть ли способ сделать это? Все, что я могу использовать string.replace в моем приложении, чтобы немного изменить запрос ..
+0

Чтобы уточнить, вам нужен один запрос с тем же sytax, который будет работать с Oracle, SQL Server и Postgres? – Tanner

+0

Да, я хочу знать, возможно ли это, по крайней мере, с небольшими изменениями во время выполнения в моем приложении со String.Replace – user3544117

+0

Проверьте мой ответ. Я рассматривал только Oracle. –

ответ

1

Часть to_date(TO_CHAR(CREATIONDATE, 'MM.YYYY'),'MM.YYYY') ненужно в выражении Analytic window и Group by. И почему вы переводите литерал на дату еще раз в select? Вам просто нужно использовать 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

+0

У меня нет других баз данных для проверки, я также не знаю синтаксиса для других баз данных. Я плохой разработчик Oracle. –

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.