统计一年中每个月的记录

Posted

技术标签:

【中文标题】统计一年中每个月的记录【英文标题】:Count records for every month in a year 【发布时间】:2012-03-27 10:58:16 【问题描述】:

我有一个总共没有 1000 条记录的表。它具有以下结构:

EMP_ID EMP_NAME PHONE_NO   ARR_DATE
1        A        545454 2012/03/12

我想计算 2012 年每个月的记录数

有什么方法可以一次性解决我的问题吗?

我试过了:

select count(*) 
from table_emp 
where year(ARR_DATE) = '2012' and month(ARR_DATE) = '01'

【问题讨论】:

好像没有问题? 从.....我想从顶部(第二行)提问 顺便说一句,在函数中包装列会使查询无法解析。 如果您花一些时间清楚地陈述您的问题,然后正确地格式化以使其可读,这将很有帮助。在这种情况下,我想您是在问如何根据 ARR_DATE 列计算一年中每个月的记录数,但这是一个猜测。如果正确,请检查 GROUP BY、COUNT()、YEAR() 和 MONTH() 的文档。 【参考方案1】:
SELECT    COUNT(*) 
FROM      table_emp 
WHERE     YEAR(ARR_DATE) = '2012' 
GROUP BY  MONTH(ARR_DATE)

【讨论】:

为什么要在 2012 年左右引用? YEAR() 返回一个数字 AFAIK。 @iDevlop 我刚刚对其进行了测试 (Microsoft SQL Server 2012 - 11.0.5058.0 (X64)),无论有无引号,它都可以工作。 ** 例如:- April 没有任何员工注册。** 因此该月的计数为 0。该记录如何添加到最终结果中。 @janaka 结果将不存在,如果您问如何强制它包括 April, 0 我认为您应该将其作为引用此问题的新问题提出 @Dan Hi Dan,你能告诉我如果我必须找到两年之间的记录,以便我必须分别显示从 2019 年 1 月到 2020 年 12 月的每个月的计数【参考方案2】:

这将为您提供 2012 年每月的计数;

SELECT MONTH(ARR_DATE) MONTH, COUNT(*) COUNT
FROM table_emp
WHERE YEAR(arr_date)=2012
GROUP BY MONTH(ARR_DATE);

演示here.

【讨论】:

我更喜欢这个,因为它也给出了月份数 我可以得到月份名称而不是数字吗?示例JanFeb 使用SELECT MONTHNAME(ARR_DATE) MONTH获取“一月”、“二月”等 月数很有帮助 此代码不起作用,因为如果给定月份没有记录,则不会显示。【参考方案3】:

试试这个查询:

SELECT 
  SUM(CASE datepart(month,ARR_DATE) WHEN 1 THEN 1 ELSE 0 END) AS 'January',
  SUM(CASE datepart(month,ARR_DATE) WHEN 2 THEN 1 ELSE 0 END) AS 'February',
  SUM(CASE datepart(month,ARR_DATE) WHEN 3 THEN 1 ELSE 0 END) AS 'March',
  SUM(CASE datepart(month,ARR_DATE) WHEN 4 THEN 1 ELSE 0 END) AS 'April',
  SUM(CASE datepart(month,ARR_DATE) WHEN 5 THEN 1 ELSE 0 END) AS 'May',
  SUM(CASE datepart(month,ARR_DATE) WHEN 6 THEN 1 ELSE 0 END) AS 'June',
  SUM(CASE datepart(month,ARR_DATE) WHEN 7 THEN 1 ELSE 0 END) AS 'July',
  SUM(CASE datepart(month,ARR_DATE) WHEN 8 THEN 1 ELSE 0 END) AS 'August',
  SUM(CASE datepart(month,ARR_DATE) WHEN 9 THEN 1 ELSE 0 END) AS 'September',
  SUM(CASE datepart(month,ARR_DATE) WHEN 10 THEN 1 ELSE 0 END) AS 'October',
  SUM(CASE datepart(month,ARR_DATE) WHEN 11 THEN 1 ELSE 0 END) AS 'November',
  SUM(CASE datepart(month,ARR_DATE) WHEN 12 THEN 1 ELSE 0 END) AS 'December',
  SUM(CASE datepart(year,ARR_DATE) WHEN 2012 THEN 1 ELSE 0 END) AS 'TOTAL'
FROM
    sometable
WHERE
  ARR_DATE BETWEEN '2012/01/01' AND '2012/12/31' 

【讨论】:

+1 用于避免不可分割的谓词,但应使用明确的日期格式,如果 datetime 数据类型,则 OP 应避免 BETWEEN(如果 date 数据类型则OK) 假设它是日期类型,因为示例数据中没有“时间” 它将显示从一月到十二月的总记录数....是否按月..? @manojkumarsingh - 它应该按月正确分隔值。我更喜欢 Joachim 的查询,因为它更短。但两者都是有效的,并且应该产生相同的计数,一个在行中,另一个在列中。 @Leigh Joachim 和我的查询之间的小区别在于,在非常大的表上,我的速度非常快,因为它不使用 GROUP BY ;)【参考方案4】:
select count(*) 
from table_emp 
 where DATEPART(YEAR, ARR_DATE) = '2012' AND DATEPART(MONTH, ARR_DATE) = '01'

【讨论】:

你的查询和我的查询输出是一样的。我想有办法让我可以按月获取数据..!

以上是关于统计一年中每个月的记录的主要内容,如果未能解决你的问题,请参考以下文章

sql 怎么查询最新一个月的数据

查询以列表形式返回一年中每个月的天数?

使用 oracle 数据注册一年中每个月的付款

使用 map reduce 程序查找一年中每个月的最高温度

我有 8 年的日常数据。我想绘制一周中的每一天、一年中的每周和一年中的每个月的所有值。我怎么做?

sql 查询每个月的记录数量