2010-11-09 44 views
10

我試圖返回一些結果分佈在連續12個月內如組名稱?SQL結果按月

在MSSQL中它會是這樣的:

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

但這是針對Oracle數據庫,以便DATEPART和日期時間都沒有。

我的問題表大致是:

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 

回答

21

用途:

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

您還可以使用:

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

參考:

+2

通過30秒打我! – 2010-11-09 20:47:54

+0

爲什麼我們不能用'mon_year組'? MySQL允許在group子句中使用別名列名。 – 2012-12-25 06:32:45

+0

@Scott Chu:Oracle不允許在Group子句中使用列別名。您必須手動匹配列中使用的表達式。里程可能因其他數據庫而異。 – ZeroK 2013-06-19 16:41:59

6

你可能要像

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

提取組似乎不適用於Oracle 10.不知道我是否正確使用它。 – 2012-09-17 03:09:47