我有一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 |
+------------+-------------+
 
我该如何实现?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
考虑使用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]