开发者社区 问答 正文

如果不存在数据,则添加归零的行 SQL Server 2016

我有一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 |
+------------+-------------+

我该如何实现?

展开
收起
心有灵_夕 2019-12-02 22:34:57 860 分享 版权
1 条回答
写回答
取消 提交回答
  • 考虑使用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 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]
    
    2019-12-02 22:37:17
    赞同 展开评论