SQL/Report Builder - 报告根据某些多月条目返回数据
Posted
技术标签:
【中文标题】SQL/Report Builder - 报告根据某些多月条目返回数据【英文标题】:SQL/Report Builder - Report to return data based on certain multple month entries 【发布时间】:2017-08-18 20:01:54 【问题描述】:我需要创建一个报告,该报告根据上一季度的打开日期和一个月内打开的任何记录返回一系列数据。
因此,如果我要在 8 月初运行报告 - 它会显示开放日期在 5 月、2 月、11 月和 8 月之间且没有年份限制的记录。开放日期月份将由运行报告的月份定义。
我有这个非常基本的代码
SELECT RecordMonth, RecordYear, caseRef, caseDescription,
caseOpenDate, caseClosedDate, PersonName, PersonSurname
FROM dbo.casereview
WHERE month(caseopendate) = 03
OR month(casecopendate) = 06
OR month(caseopendate) = 09
OR month(caseopendate) = 12
问题是,我需要它动态运行,因此无论运行哪个月份,它都可以显示打开日期在前几个季度/月份内的情况。
【问题讨论】:
【参考方案1】:您可以使用 Modulo 根据当前系统日期计算您需要的 4 个月数字,然后过滤这些数字。
在你的情况下,这样的事情会起作用。
DECLARE @month int = month(getdate())
DECLARE @m1 int = ((@month -1 ) % 12) +1
DECLARE @m2 int = ((@month + 2) % 12) +1
DECLARE @m3 int = ((@month + 5) % 12) +1
DECLARE @m4 int = ((@month + 8) % 12) +1
SELECT RecordMonth, RecordYear, caseRef, caseDescription,
caseOpenDate, caseClosedDate, PersonName, PersonSurname
FROM dbo.casereview
WHERE month(caseopendate) IN (@m1, @m2, @m3, @m4)
首先这是获取当前月份的编号,我们通过使用getdate()
获取当前日期并使用MONTH
函数仅返回月份编号。所以今天这将等于 8。
接下来我们使用模数(%
符号)计算出我们需要几月。
例如,如果month = 6,则@m4 计算为
(@month + 8) = 14
14 % 12 = 2(14 的余数除以 12)
2 + 1 = 3
注意:我已经把它写得比它需要的长一点,所以它更容易阅读。我们可以将 @m1、@m2 等的计算结果直接放入 select 语句中,但单独执行会更清楚。
请注意,我还在WHERE
子句中使用了IN
语句而不是一堆OR
s。 IN
只匹配括号中列出的任何值。
【讨论】:
哎呀,你在我编码的时候发帖了。呃,好吧。你的更干净;虽然我特别试图避免使用变量,以防万一对询问者很重要。【参考方案2】:假设您希望所有匹配的行都按 opendate 顺序排列,我们可以简单地使用 Modulus 函数。我们可以做四个MONTH % 12
查询,或者一个MONTH % 3
查询。
我建了一个测试数据库来展示基本流程:
create database [_TEST_QUARTERS];
GO
USE [_TEST_QUARTERS];
GO
create table [CASEREVIEW] (
[CASE_ID] integer primary key,
[CASEOPENDATE] date
);
insert into [CASEREVIEW] values ( 1, '2016-09-19');
insert into [CASEREVIEW] values ( 2, '2016-10-20');
insert into [CASEREVIEW] values ( 3, '2016-11-11');
insert into [CASEREVIEW] values ( 4, '2016-12-22');
insert into [CASEREVIEW] values ( 5, '2017-01-11');
insert into [CASEREVIEW] values ( 6, '2017-02-12');
insert into [CASEREVIEW] values ( 7, '2017-03-13');
insert into [CASEREVIEW] values ( 8, '2017-04-14');
insert into [CASEREVIEW] values ( 9, '2017-05-15');
insert into [CASEREVIEW] values (10, '2017-06-16');
insert into [CASEREVIEW] values (11, '2017-07-17');
insert into [CASEREVIEW] values (12, '2017-08-18');
所以我们可以看到它必须从中选择的数据:
select CURRENT_TIMESTAMP as [Today];
select * from [CASEREVIEW];
以及实际的查询:
select [CASE_ID], [CASEOPENDATE] from [CASEREVIEW]
where MONTH(CONVERT(VARCHAR(10), [CASEOPENDATE], 120)) % 3 = MONTH(CONVERT(VARCHAR(10), CURRENT_TIMESTAMP, 120)) % 3
ORDER BY [CASEOPENDATE];
结果:
CASE_ID CASEOPENDATE
----------- ------------
3 2016-11-11
6 2017-02-12
9 2017-05-15
12 2017-08-18
(4 row(s) affected)
【讨论】:
以上是关于SQL/Report Builder - 报告根据某些多月条目返回数据的主要内容,如果未能解决你的问题,请参考以下文章
IIF 表达式中的 SQL Report Builder time(0) 和 int
FastMM 报告 C++ Builder 6 中 STL 容器的内存泄漏
SSRS Report Builder崩溃了,现在它不会重新打开报告