按月分组的 SQL 结果

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4138371/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 08:12:16  来源:igfitidea点击:

SQL Results group by month

sqloraclegroup-by

提问by madlan

I'm trying to return some results spread over a rolling 12 month period eg:

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

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

How do I spread the results over a date range, populating the first column with the month name?

如何将结果分布在一个日期范围内,用月份名称填充第一列?

IN MSSQL it would be something like:

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

But this is against an Oracle database so DATEPART and DateTime are not available.

但这是针对 Oracle 数据库的,因此 DATEPART 和 DateTime 不可用。

My Problem table is roughly:

我的问题表大致是:

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

回答by OMG Ponies

Use:

用:

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

You could also use:

您还可以使用:

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

Reference:

参考:

回答by Justin Cave

You probably want something like

你可能想要类似的东西

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 )