SqlServer-如何显示每个月的数据,包括没有数据的月份

时间:2019-05-08 07:02:50

标签: sql sql-server

您能在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

预先感谢

2 个答案:

答案 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);

更多参考信息check the answer here from stack exchange

答案 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)