I have a table that stores customer information including their registration date with the service. I would like to know the total number of subscribed customers (from the beginning of the service up until that day) at the end of the day for the past 10 days.
I imagine the solution would be something similar to a for loop, so the best I managed so far is the following:
DECLARE @Counter INT
SET @Counter=1
WHILE ( @Counter <= 10)
BEGIN
select try_convert(date, getdate()-@Counter), count(id)
from Table_name
where try_convert(date, registrationdate) <= try_convert(date, getdate()-@Counter)
SET @Counter = @Counter + 1
END
The problem with the above script is that it produces 10 different tables and I haven’t been able to union them together. I’m fairly new to SQL so there might be a simpler solution that I’m missing!
The output I have in mind looks like this:
date | total number registered |
---|---|
2022-01-30 | 500,000 |
2022-01-29 | 499,800 |
Advertisement
Answer
It has nothing to do with a loop. You would simply create an SQL select that selects them. ie:
select *
from myTable
where datediff(day, registrationDate, getdate()) <= 10;
EDIT: Question is edited to show the desired output now, then it would need a different way like:
select registrationDate, count(*) as TotalNumberRegistered
from myTable
where datediff(day, registrationDate, getdate()) <= 10
group by registrationDate;
EDIT: If as P.Salmon said you were after a “running total” then you still can get it with a slight modification to code:
WITH dailyTotals(registrationDate, TotalNumberRegistered) AS
(
SELECT registrationDate, COUNT(*)
FROM myTable
WHERE DATEDIFF(DAY, registrationDate, GETDATE())<=10
GROUP BY registrationDate
)
SELECT registrationDate
, SUM(TotalNumberRegistered) OVER (ORDER BY registrationDate) AS TotalNumberRegistered
FROM dailyTotals
Order by registrationDate desc; -- you want it to be ordered last date first?
Here is DBFiddle demo