T-SQL - 插入特定时间段的缺失数据
T-SQL - Insert Missing Data for Specific Period of Time
我无法解决这个缺少 4/13-4/15 数据的问题。见截图:Daily Subscriber Counts
此屏幕截图由[编辑:部分]以下代码制作:
SELECT
MIN([AsOfDate]) AS StartDate,
MAX([AsOfDate]) AS EndDate,
SUM([TotalCustomers]) AS TotalSubs,
SUM([HSDCustomers]) AS HSDSubs,
SUM([PhoneCustomers]) AS PhoneSubs,
SUM([VideoCustomers]) AS VideoSubs
FROM
[vDailyCustomerCounts]
WHERE
Sourcesystem = 'ICOMS'
AND (Asofdate BETWEEN '4/8/2018' AND '4/18/2018')
AND iscommercial = 0
GROUP BY
[AsOfDate]
ORDER BY
[AsOfDate] DESC
基本上我的问题是我需要将 "dummy" 数据插入到 select 语句中。我需要为 2018-04-13 到 2018-04-15 创建一行,并使用一般计数(如 502,900)或使用前一天的计数来填充它。
理想情况下,我想创建如下所示的内容:
StartDate End Date TotalSubs
----------------------------------
2018-04-13 2018-04-13 502900
我只想在数据集中缺少一天的情况下插入这个虚拟数据。如果有任何帮助,我将不胜感激!
查看此网页:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017
如果存在不需要的值,您可以在 SELECT 语句中使用 CASE 来选择一个虚拟值。
使用这样的循环首先填写您缺少的日期 - 然后添加默认值并继续您的聚合
declare @mindate datetime=(select min(Asofdate) from vDailyCustomerCounts)
declare @maxdate datetime=(select max(Asofdate) from vDailyCustomerCounts)
declare @date datetime=@mindate
declare @missing table(datevalue datetime )
while @date<@maxdate
begin
if @date not in (select Asofdate from vDailyCustomerCounts)
insert @missing
select @date
set @date=@date+1
end
select a.datevalue,
b.TotalCustomers ,
b.HSDCustomers ,
b.PhoneCustomers,
b.VideoCustomers
from (select Asofdate from vDailyCustomerCounts
union select * from @missing )a
left join vDailyCustomerCounts b on a.Asofdate =b.Asofdate
我无法解决这个缺少 4/13-4/15 数据的问题。见截图:Daily Subscriber Counts
此屏幕截图由[编辑:部分]以下代码制作:
SELECT
MIN([AsOfDate]) AS StartDate,
MAX([AsOfDate]) AS EndDate,
SUM([TotalCustomers]) AS TotalSubs,
SUM([HSDCustomers]) AS HSDSubs,
SUM([PhoneCustomers]) AS PhoneSubs,
SUM([VideoCustomers]) AS VideoSubs
FROM
[vDailyCustomerCounts]
WHERE
Sourcesystem = 'ICOMS'
AND (Asofdate BETWEEN '4/8/2018' AND '4/18/2018')
AND iscommercial = 0
GROUP BY
[AsOfDate]
ORDER BY
[AsOfDate] DESC
基本上我的问题是我需要将 "dummy" 数据插入到 select 语句中。我需要为 2018-04-13 到 2018-04-15 创建一行,并使用一般计数(如 502,900)或使用前一天的计数来填充它。
理想情况下,我想创建如下所示的内容:
StartDate End Date TotalSubs
----------------------------------
2018-04-13 2018-04-13 502900
我只想在数据集中缺少一天的情况下插入这个虚拟数据。如果有任何帮助,我将不胜感激!
查看此网页:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017
如果存在不需要的值,您可以在 SELECT 语句中使用 CASE 来选择一个虚拟值。
使用这样的循环首先填写您缺少的日期 - 然后添加默认值并继续您的聚合
declare @mindate datetime=(select min(Asofdate) from vDailyCustomerCounts)
declare @maxdate datetime=(select max(Asofdate) from vDailyCustomerCounts)
declare @date datetime=@mindate
declare @missing table(datevalue datetime )
while @date<@maxdate
begin
if @date not in (select Asofdate from vDailyCustomerCounts)
insert @missing
select @date
set @date=@date+1
end
select a.datevalue,
b.TotalCustomers ,
b.HSDCustomers ,
b.PhoneCustomers,
b.VideoCustomers
from (select Asofdate from vDailyCustomerCounts
union select * from @missing )a
left join vDailyCustomerCounts b on a.Asofdate =b.Asofdate