我有一个员工表,我需要从指定月份获取过去两年中每月的员工总数。
桌子设计
+-----------+-------------+
| Field | Type |
+-----------+-------------+ |
| emp_name | varchar(30) |
| join_date | date |
| emp_id | int(5) |
+-----------+-------------+
如果我在下拉列表中选择当前月份(2022 年 12 月),我需要在下面显示输出。
+-----------+-------------+
| Month | Emp.Count |
+-----------+-------------+
| Dec 22 | 10 |
| Nov 22 | 8 |
| Oct 22 | 3 |
| ...... | . |
| ...... | . |
| ...... | . |
| Dec 21 | 5 |
| Nov 21 | 6 |
| Oct 21 | 7 |
| Sept 21 | 7 |
+-----------+-------------+
我尝试了以下查询,但计数添加了 1 月(2021 年和 2022 年)
SELECT MAX(DATENAME(MM,[join_date])) AS Month, COUNT(1) AS "Total.EMP"
FROM [EMP_TABLE]
WHERE [join_date] BETWEEN DATEADD(yy, DATEDIFF(yy,0,GETDATE()), 0) AND GETDATE()
GROUP BY MONTH([join_date]);
我需要形成存储过程(我将传递月份和年份作为参数),并且我在月份列下得到的输出为 1 月、12 月而不是 12 月 22 日,根据月份值和年份,我需要生成过去 24 个月计数结果。
您的原始查询存在两个问题。首先,您的
GROUP BY
条款仅包含月份。其次,你的DATEADD
中的WHERE
没有正确使用。这是对您的代码进行最小修改的更正:
更新为根据评论按年份和月份数字排序。
MS SQL Server 2017 架构设置:
CREATE TABLE EMP_TABLE (
join_date datetime
);
INSERT INTO EMP_TABLE (join_date)
VALUES
('2022-12-1')
, ('2022-12-2')
, ('2022-12-3')
, ('2022-11-4')
, ('2022-11-5')
, ('2021-12-6')
, ('2021-11-6')
, ('2021-11-8')
, ('2021-11-9')
, ('2021-4-6')
;
查询1:
WITH prelim as (
SELECT
YEAR([join_date]) AS Year
, MONTH([join_date]) AS MONTH
, COUNT(1) AS "Total.EMP"
FROM [EMP_TABLE]
WHERE [join_date] BETWEEN DATEADD(YEAR, -2, GETDATE()) AND GETDATE()
GROUP BY YEAR([join_date]), MONTH([join_date])
)
SELECT
[Year]
, [Month]
, DATENAME(MM,DATEFROMPARTS([Year],[Month],1)) AS MonthName
, [Total.EMP]
FROM prelim
ORDER BY [Year] DESC, [Month] DESC
结果:
| Year | Month | MonthName | Total.EMP |
|------|-------|-----------|-----------|
| 2022 | 12 | December | 3 |
| 2022 | 11 | November | 2 |
| 2021 | 12 | December | 1 |
| 2021 | 11 | November | 3 |
| 2021 | 4 | April | 1 |