您能在Sql server中帮我吗,我有从中获取日期明智数据的表。 表结构。
Date Amount
-----------------
2019-05-04 16128.00
2019-05-06 527008.00
2019-05-07 407608.00
2019-05-10 407608.00
以上查询我想填写缺少的日期,我的期望如下所示
Date Amount
-----------------
2019-05-04 16128.00
2019-05-05 00
2019-05-06 527008.00
2019-05-07 407608.00
2019-05-08 0
2019-05-09 0
2019-05-10 407608.00
预先感谢
答案 0 :(得分:0)
您可以使用calndar帮助表,否则可以像这样DECLARE @fromdate DATE = '20190504', @todate DATE = '20190510'
分配开始日期和开始日期,可以更改开始日期和开始日期。
CREATE TABLE #amounttable
(
Dt DATE,
Amount BIGINT
);
INSERT into #amounttable(Dt, Amount) VALUES('2019-05-04',16128);
INSERT into #amounttable(Dt, Amount) VALUES('2019-05-06',527008);
INSERT into #amounttable(Dt, Amount) VALUES('2019-05-07',407608);
INSERT into #amounttable(Dt, Amount) VALUES('2019-05-10',407608);
DECLARE @fromdate DATE = '20190504', @todate DATE = '20190510';
SELECT c.d as Date, Amount = COALESCE(s.Amount,0)
FROM
(
SELECT TOP (DATEDIFF(DAY, @fromdate, @todate)+1)
DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, @fromdate)
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number
) AS c(d)
LEFT OUTER JOIN #amounttable AS s
ON c.d = s.Dt
WHERE c.d >= @fromdate
AND c.d < DATEADD(DAY, 1, @todate);
答案 1 :(得分:0)
一种非常简单的方法是使用递归CTE生成日期,然后使用left join
引入日期:
with cte as (
select min(t.dte) as dte, max(t.dte) as maxdate
from t
union all
select dateadd(day, 1, dte), maxdate
from cte
where dte < maxdate
)
select cte.dte, coalesce(t.amount, 0) as amount
from cte left join
t
on cte.dte = t.dte;
Here是db <>小提琴。
请注意,递归的默认深度为100,因此对于更长的时间,您应该添加OPTION (MAXRECURSION 0)
。