如果没有数据,则添加归零的行SQL Server 2016

问题描述 投票:1回答:2

我有一个名为Datetime[Start Time]列,我用它从SQL代码中提取日期

convert(date, format([Start Time], 'dd/MM/yyyy'), 103) as [Date]

然后我还有其他列,然后按[Date]分组,例如

sum([profit]) as [DailyProfit]

都很好。但是,由于我的日期列表基于一个字段,因此在没有数据的情况下会丢失行。也就是说,如果11月3日没有销售,我的数据就可以通过

+------------+-------------+
|    Date    | DailyProfit |
+------------+-------------+
| 01/11/2019 |        5000 |
| 02/11/2019 |        4000 |
| 04/11/2019 |        4500 |
| 05/11/2019 |        3500 |
+------------+-------------+ 

我想发生的是创建了那些行,但所有字段中的行都为0。

+------------+-------------+
|    Date    | DailyProfit |
+------------+-------------+
| 01/11/2019 |        5000 |
| 02/11/2019 |        4000 |
| 03/11/2019 |           0 |
| 04/11/2019 |        4500 |
| 05/11/2019 |        3500 |
+------------+-------------+

我该如何实现?

sql sql-server
2个回答
2
投票

考虑使用CTE生成一个范围内所有日期的列表(因为您提到您没有创建表的权限-因为您无法存储dates tally table。]

Declare @FromDate   Date = '2019-01-01',
        @ToDate     Date = '2019-01-30'

;WITH TallyDates AS
    (
        SELECT @FromDate AS NextDate
        UNION ALL
        SELECT DATEADD(DAY, 1, NextDate) as NextDate
        FROM TallyDates
        WHERE NextDate <= @ToDate
        )
SELECT d.NextDate as [Date]
    , CASE 
          WHEN pt.[Date] IS NULL
              THEN 0
          ELSE pt.Profit
      END as DailyProfit
FROM TallyDates d
    LEFT JOIN ProfitTable pt
        ON d.NextDate = pt.[Date]

如果您有权利,您还可以将此CTE的结果保存在一个临时表中,并多次使用,因为它在每个会话中都是保存的。

代码看起来像:

Declare @FromDate   Date = '2019-01-01',
        @ToDate     Date = '2019-01-30'

;WITH TallyDates AS
    (
        SELECT @FromDate AS NextDate
        UNION ALL
        SELECT DATEADD(DAY, 1, NextDate) as NextDate
        FROM TallyDates
        WHERE NextDate <= @ToDate
        )
SELECT NextDate
INTO #TallyDates_tmp
FROM TallyDates

SELECT d.NextDate as [Date]
    , CASE 
          WHEN pt.[Date] IS NULL
              THEN 0
          ELSE pt.Profit
      END as DailyProfit
FROM #TallyDates_tmp d
    LEFT JOIN ProfitTable pt
        ON d.NextDate = pt.[Date]

0
投票

我假设您在执行select语句时需要它。您可以尝试select Date, COALESCE(sum([profit]),0) as [DailyProfit] default 0 from .... where ...)

© www.soinside.com 2019 - 2024. All rights reserved.