如何基于SQL Server日期参数统计代理首3个月生产数据?
解决方案:基于代理开通日期筛选首3个月生产数据
针对你的需求,我们可以通过行转列结合日期函数的方式,轻松实现用@Date参数来限定查询范围的报表。以下是具体的SQL实现思路和代码:
核心思路
- 把每个代理的3个月产量数据从宽表(3列)转换成窄表(3行),让每条记录对应一个月的生产数据;
- 通过
DATEADD函数计算每个代理首3个月的准确月份; - 用
@Date参数筛选出目标月份/时间段内的生产数据。
代码实现(按目标月份查询)
这个例子会返回所有在指定月份处于首3个月的代理及其对应产量:
-- 定义目标月份参数,这里可以替换成任意日期,会自动匹配当月 DECLARE @TargetMonth DATE = '2017-06-01'; -- 统一转换为当月第一天,避免日期偏差 SET @TargetMonth = DATEFROMPARTS(YEAR(@TargetMonth), MONTH(@TargetMonth), 1); SELECT fAgent AS 代理名称, -- 格式化月份为你需要的样式(比如June-17) DATENAME(MONTH, FirstThreeMonth) + '-' + RIGHT(YEAR(FirstThreeMonth), 2) AS 月份, Production AS 产量 FROM ( SELECT fAgent, -- 计算首3个月的日期:开通日期+1/2/3个月 DATEADD(MONTH, rn, fOpenDate) AS FirstThreeMonth, -- 匹配对应月份的产量 CASE rn WHEN 1 THEN fMonth1 WHEN 2 THEN fMonth2 WHEN 3 THEN fMonth3 END AS Production FROM YourTableName -- 替换成你的实际表名 -- 用CROSS APPLY把3列数据拆成3行 CROSS APPLY (VALUES (1), (2), (3)) AS Months(rn) ) AS AgentMonthlyData -- 筛选目标月份的记录 WHERE FirstThreeMonth >= @TargetMonth AND FirstThreeMonth < DATEADD(MONTH, 1, @TargetMonth);
扩展:按日期范围查询
如果你需要统计某个时间段内所有代理的首3个月数据,只需要修改WHERE条件即可:
DECLARE @StartDate DATE = '2017-03-01'; DECLARE @EndDate DATE = '2017-05-31'; SELECT fAgent AS 代理名称, DATENAME(MONTH, FirstThreeMonth) + '-' + RIGHT(YEAR(FirstThreeMonth), 2) AS 月份, Production AS 产量 FROM ( SELECT fAgent, DATEADD(MONTH, rn, fOpenDate) AS FirstThreeMonth, CASE rn WHEN 1 THEN fMonth1 WHEN 2 THEN fMonth2 WHEN 3 THEN fMonth3 END AS Production FROM YourTableName CROSS APPLY (VALUES (1), (2), (3)) AS Months(rn) ) AS AgentMonthlyData WHERE FirstThreeMonth BETWEEN @StartDate AND @EndDate;
说明
- 代码中的
YourTableName需要替换成你的实际数据表名; DATENAME(MONTH, ...)会返回英文月份名,如果你需要中文可以调整为对应语言的格式(取决于你使用的SQL数据库版本);- 所有日期计算都基于开通日期的月份偏移,完全匹配你给出的代理A/B/C的首3个月规则。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

