我正在尝试在一个时间范围内每天统计并包括活动帐户(@params确定时间范围窗口)。但结果必须指定每天活动帐户的数量。我的难题是:如何包含每天的帐户?它使用动态sql吗?如果是,怎么做?
要求:统计并包括每天的活动帐户:
活动帐户是指开始日期早于或等于显示日期,结束日期晚于同一日期的帐户
如果帐户的结束日期为null,则表示该帐户处于活动状态(假设其开始日期在该范围内),例如:开始日期为2020-03-01,结束日期为2020-03-04的帐户将在2020-03-01、02、03和04被视为处于活动状态。在那些日子里它应该包括在内。但不是2020-02-28或2020-03-05。
SELECT
A.Date,
A.Location,
count(*) as ActiveAccs ,
CountOfAccounts as numOfAccs,
ServiceCategory ,
CountOfAccounts-count(1) as AvailableAccs,
FROM accLocationStats A
LEFT OUTER JOIN Accounts B
ON A.Location=B.Location
WHERE b.StartDate is not null --StartDate of Null = they are unwanted accounts
--this is where things go bad. Do I need dynamic SQL?
AND ( b.EndDate is NULL)
--Examination window: we want accounts in this time frame . Please remember that I need to count per day, NOT count for the entire period.
AND (Date>=@param1 AND Date<=@param2)
GROUP BY A.Date,a.Location,CountOfAccounts,ServiceCategory
2条答案
按热度按时间aamkag611#
我看到accounts表上有start-and-enddate,acclocationstats表上有date,@params应该只应用于date字段吗?在这种情况下,您可以使用:
如果@params也需要应用于start和enddate字段,您可以添加以下内容之一:
或
或
不需要动态sql,只需在where子句中添加这些条件即可。
nhjlsmyf2#
对于这样的情况,有一个简单的日期表是非常宝贵的。如果您希望每天都得到一个结果,唯一能保证您得到该结果的方法是一个包含每个日期的表。我建议使用一个名为“dates”的永久表,或者包含最近历史(200年左右)中每天的内容。然后你可以在上面选择,然后对你的账户做一个子查询,看看哪个账户在那一天是活跃的。下面是一个例子,我将如何在一个客户表上这样做,我有类似于您的情况。