2010-11-09 14 views
10

Ich versuche, einige Ergebnisse verteilt über einen Zeitraum von 12 Monaten Roll zB zurückzukehren:SQL Ergebnisse Gruppe von Monat

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

Wie kann ich die Ergebnisse über einen Zeitraum verteilt, die erste Spalte mit dem Monat bevöl Name?

IN MSSQL wäre es so etwas wie:

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

Aber das ist für eine Oracle-Datenbank so Datepart und Datetime nicht verfügbar ist.

Mein Problem Tabelle ist ungefähr:

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 

Antwort

21

Verwendung:

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

Sie könnten auch verwenden:

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

Referenz:

+2

mich schlagen um 30 Sekunden! –

+0

Warum können wir 'group by mon_year' nicht verwenden? MySQL erlaubt die Verwendung von Alias-Spaltennamen in Gruppenklauseln. –

+0

@Scott Chu: Oracle lässt die Verwendung von Spaltenaliasnamen in der Gruppenklausel nicht zu. Sie müssen den in der Spalte verwendeten Ausdruck manuell anpassen. Die Laufleistung kann mit anderen DBs variieren. – ZeroK

6

Sie wollen wahrscheinlich etwas wie

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

Gruppe per Extrakt scheint nicht auf Oracle 10 zu arbeiten. Nicht sicher, ob ich es richtig verwende. –