当前位置: 首页 > 面试题库 >

SQL结果按月分组

蓬弘
2023-03-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);

但这是针对Oracle数据库的,因此DATEPART和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

问题答案:

使用:

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


 类似资料:
  • 问题内容: 我有一个具有此架构的表 我正在尝试使查询工作显示每个月的总数。到目前为止,我已经尝试过DateDiff和嵌套选择,但都没有给我想要的东西。我认为这是最接近的: 但是当我应该获取值时,我只会得到空值。我想念什么吗? 问题答案: 您也可以尝试:

  • 问题内容: 我的表格显示了各个国家/地区进行的搜索量以及进行搜索的日期,我想要一个查询来向我显示2012年和2013年每个月的搜索量,我需要为月份添加单独的列,年份和搜索次数。我以前使用过下面的查询,该查询返回每周进行的搜索量,但我想将其更改为仅2012和2013年每月进行的搜索。 问题答案: 只需使用MONTH()和YEAR()函数

  • 问题内容: 我在Postgres服务器上有以下数据库表: 我想创建一个查询,给出了的按月份和年份如下列并对结果进行分组: 有没有简单的方法可以做到这一点? 问题答案: 应Radu的要求,我将解释该查询: :将“日期”属性转换为月的简短形式的定义格式。 :Postgresql的“提取”功能用于从“日期”属性中提取YYYY年。 :SUM()函数将所有“ Sales”值相加,并提供区分大小写的别名,并使

  • 有没有一个简单的方法可以做到这一点?

  • 问题内容: 我有一个包含会话事件时间戳的表。我想根据时间戳查询两个会话之间至少有10分钟的事件间隔时,我有多少会话。我可以使用MySql查询来计算会话数吗? 谢谢 问题答案: 在您的桌子上只有很少的信息,这对您来说只是一个基本的想法,但是您可以执行以下操作: 获取所有时间戳,并将它们与所有其他较大的时间戳合并,然后使用MIN将其缩小到下一个最大的时间戳。然后从中选择差异小于600秒的计数(假设使用

  • 问题内容: 这是我的mysql收入表。 字段“日期”是标准sql日期。我执行此查询的目的是按月计算收入总和,如果某个月没有收入,则返回零。如果某个月没有任何收入,我想要零,因为我想在图表中显示这些数据。 这是查询。 但是我只会得到如下输出。如果其他月份没有值,则没有零。这是输出。 我希望上表中的其他月份和total_num为零。我怎样才能做到这一点?那里也有同样的问题。但没有有效的答案。 按月分组