首页 > 解决方案 > SqlServer - 如何显示每个月的数据,包括没有数据的月份

问题描述

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

提前致谢

标签: sqlsql-server

解决方案


您可以使用日历帮助表,否则像这样分配开始日期和开始日期,从日期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);

如需更多参考,请查看堆栈交换中的答案


推荐阅读