2010-11-09 43 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