2010-11-09 10 views
10

Je suis en train de retourner des résultats répartis sur une période glissante de 12 mois par exemple:Résultats SQL groupe par mois

MONTH  IN OUT 
January 210 191 
February 200 111 
March  132 141 
April  112 141 
May  191 188 
etc... 

Comment puis-je diffuser les résultats sur une plage de dates, peuplant la première colonne du mois prénom?

EN MSSQL ce serait quelque chose comme:

SELECT COUNT(problem.problem_type = 'IN') AS IN, 
    COUNT(problem.problem_type = 'OUT') AS OUT, 
    DATEPART(year, DateTime) as Year, 
    DATEPART(month, DateTime) as Month 
FROM problem 
WHERE (DateTime >= dbo.FormatDateTime('2010-01-01')) 
    AND 
    (DateTime < dbo.FormatDateTime('2010-01-31')) 
GROUP BY DATEPART(year, DateTime), 
    DATEPART(month, DateTime); 

Mais ceci est contre une base de données Oracle afin DATEPART et DateTime ne sont pas disponibles.

Ma table problème est à peu près:

problem_ID Problem_type IN_Date      OUT_Date 
    1   IN  2010-01-23 16:34:29.0  2010-02-29 13:06:28.0 
    2   IN  2010-01-27 12:34:29.0  2010-01-29 12:01:28.0 
    3   OUT  2010-02-13 13:24:29.0  2010-09-29 15:04:28.0 
    4   OUT  2010-02-15 16:31:29.0  2010-07-29 11:03:28.0 

Répondre

21

Utilisation:

SELECT SUM(CASE WHEN p.problem_type = 'IN' THEN 1 ELSE 0 END) AS IN, 
     SUM(CASE WHEN p.problem_type = 'OUT' THEN 1 ELSE 0 END) AS OUT, 
     TO_CHAR(datetime, 'YYYY') AS year, 
     TO_CHAR(datetime, 'MM') AS month 
    FROM PROBLEM p 
    WHERE p.DateTime >= TO_DATE('2010-01-01', 'YYYY-MM-DD') 
    AND p.DateTime < TO_DATE('2010-01-31', 'YYYY-MM-DD') 
GROUP BY TO_CHAR(datetime, 'YYYY'), TO_CHAR(datetime, 'MM') 

Vous pouvez également utiliser:

SELECT SUM(CASE WHEN p.problem_type = 'IN' THEN 1 ELSE 0 END) AS IN, 
     SUM(CASE WHEN p.problem_type = 'OUT' THEN 1 ELSE 0 END) AS OUT, 
     TO_CHAR(datetime, 'MM-YYYY') AS mon_year 
    FROM PROBLEM p 
    WHERE p.DateTime >= TO_DATE('2010-01-01', 'YYYY-MM-DD') 
    AND p.DateTime < TO_DATE('2010-01-31', 'YYYY-MM-DD') 
GROUP BY TO_CHAR(datetime, 'MM-YYYY') 

Référence:

+2

me battre de 30 secondes! –

+0

Pourquoi ne pouvons-nous pas utiliser 'group by mon_year'? MySQL permet l'utilisation du nom de colonne d'alias dans la clause de groupe. –

+0

@Scott Chu: Oracle n'autorise pas l'utilisation de l'alias de colonne dans la clause Group. Vous devez correspondre manuellement à l'expression utilisée dans la colonne. Le kilométrage peut varier avec d'autres DB. – ZeroK

6

Vous voulez probablement quelque chose comme

SELECT SUM((CASE WHEN problem_type = 'IN' THEN 1 ELSE 0 END)) in, 
     SUM((CASE WHEN problem_type = 'OUT' THEN 1 ELSE 0 END)) out, 
     EXTRACT(year FROM DateTime) year, 
     EXTRACT(month FROM DateTime) month 
    FROM problem 
WHERE DateTime >= date '2010-01-01' 
    AND DateTime < date '2010-01-31' 
GROUP BY EXTRACT(year FROM DateTime), 
      EXTRACT(month FROM DateTime) 
+0

Grouper par extrait ne semble pas fonctionner sur Oracle 10. Je ne sais pas si je l'utilise correctement. –