代码之家  ›  专栏  ›  技术社区  ›  madlan

按月份分组的SQL结果

  •  11
  • madlan  · 技术社区  · 14 年前

    我正试图在12个月的滚动期内返回一些结果,例如:

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

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

    我的问题表大致如下:

    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
    
    2 回复  |  直到 12 年前
        1
  •  22
  •   OMG Ponies    14 年前

    使用:

      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
  •  6
  •   Justin Cave    14 年前

    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 )