对日期范围内的活动行进行计数

zbdgwd5y  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(353)

我正在尝试在一个时间范围内每天统计并包括活动帐户(@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
aamkag61

aamkag611#

我看到accounts表上有start-and-enddate,acclocationstats表上有date,@params应该只应用于date字段吗?在这种情况下,您可以使用:

a.Date BETWEEN @param1 AND @param2

如果@params也需要应用于start和enddate字段,您可以添加以下内容之一:

b.StartDate BETWEEN @param1 AND @param2
AND ISNULL(b.EndDate, @param2) BETWEEN @param1 AND @param2

@param1 BETWEEN b.StartDate AND ISNULL(b.EndDate, @param1)
AND @param2 BETWEEN b.StartDate AND ISNULL(b.EndDate, @param2)

b.StartDate >= @param1
AND ISNULL(b.EndDate, b.StartDate) <= @param2

不需要动态sql,只需在where子句中添加这些条件即可。

nhjlsmyf

nhjlsmyf2#

对于这样的情况,有一个简单的日期表是非常宝贵的。如果您希望每天都得到一个结果,唯一能保证您得到该结果的方法是一个包含每个日期的表。我建议使用一个名为“dates”的永久表,或者包含最近历史(200年左右)中每天的内容。然后你可以在上面选择,然后对你的账户做一个子查询,看看哪个账户在那一天是活跃的。下面是一个例子,我将如何在一个客户表上这样做,我有类似于您的情况。

declare @fdate as date = '2020-06-01',@tdate as date = '2020-06-30'

select d.date,(select count(*) from CustMast c where c.installdate >= d.date and c.pulldate <= d.date) activeAccts
from dates d
where d.date between @fdate and @tdate

相关问题