Подсчет активных строк в диапазоне дат - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь подсчитать и включить активные учетные записи в день в течение определенного периода времени (@params определяет временное окно). Но в результате необходимо указать количество активных аккаунтов в сутки. Моя борьба с этим: как включать аккаунты в день? Использует ли он динамику c SQL? если да, то как?

Требования: Подсчитайте и включите активные учетные записи за день:

  1. Активная учетная запись - это учетная запись, для которой дата начала ДО или равна указанной дате , endDate находится после той же даты
  2. Если конечная дата учетной записи равна NULL, это означает, что она активна (при условии, что она имеет дату начала, которая попадает в диапазон) Пример: учетная запись с датой начала 2020- 03-01 и дата окончания 2020-03-04 будут считаться активными 2020-03-01, 02, 03 и 04. Это должно быть включено / засчитано в эти дни. Но не 28.02.2020 или 05.03.2020.
    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 ]

0 голосов
/ 05 августа 2020

Для подобных случаев неоценима простая таблица дат. Если вы хотите получать один результат в день, единственный способ гарантировать, что вы его получите, - это таблица, содержащая каждую дату. Я рекомендую постоянную таблицу под названием «даты» или что-то, что содержит каждый день недавней истории (около 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
0 голосов
/ 05 августа 2020

Я вижу, что у вас есть Start- и EndDate в таблице Accounts и Date в таблице accLocationStats. Следует ли применять @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

Dynami c SQL не должно быть обязательным для этого, и эти условия можно просто добавить в предложение where.

...