2010-11-09 14 views
10

sto cercando di restituire alcuni risultati si sviluppa su un rolling 12 mesi periodo per esempio:SQL gruppo I risultati per il mese

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

Come faccio a diffondere i risultati nel corso di un intervallo di date, popolando la prima colonna con il mese nome?

in MSSQL sarebbe qualcosa di simile:

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

Ma questo è in un database Oracle in modo DATEPART e DateTime non sono disponibili.

Il mio tavolo problema è grosso modo:

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 

risposta

21

Usa:

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

Si potrebbe anche usare:

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

Riferimento:

+2

mi ha battuto di 30 secondi! –

+0

Perché non possiamo usare "group by mon_year"? MySQL consente l'uso del nome di colonna alias nella clausola di gruppo. –

+0

@Scott Chu: Oracle non consente l'utilizzo dell'alias di colonna nella clausola Group. È necessario abbinare manualmente l'espressione utilizzata nella colonna. Il chilometraggio può variare con altri DB. – ZeroK

6

Probabilmente si desidera qualcosa di simile

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

Il gruppo di estrazione sembra non funzionare su Oracle 10. Non sono sicuro se lo sto usando correttamente. –