统计一年中每个月的记录
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.
【讨论】:
我更喜欢这个,因为它也给出了月份数 我可以得到月份名称而不是数字吗?示例Jan
、Feb
使用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'
【讨论】:
你的查询和我的查询输出是一样的。我想有办法让我可以按月获取数据..!以上是关于统计一年中每个月的记录的主要内容,如果未能解决你的问题,请参考以下文章