【问题标题】:How to return empty data even if there isn't any for a specific range?即使特定范围没有任何数据,如何返回空数据?
【发布时间】:2017-04-11 15:11:05
【问题描述】:

我想从表格中返回特定日期范围内的数据。为此,我有一个接受 @fromDate@toDate 参数的存储过程。

sql 如下所示:

DECLARE @fromDate DATETIME, @toDate DATETIME

SET @fromDate = '2017-04-01'
SET @toDate = '2017-04-07'

SELECT MD.ID, MD.Name, RT.Result, RT.DateOn
FROM MainData MD
  LEFT JOIN ResultsTable RT
  RT.MainDataID = MD.ID
WHERE RT.DateOn >= @fromDate AND RT.DateOn <= @toDate

这按预期工作并返回此范围内的结果,但我的问题是即使ResultsTable 中没有结果我也想返回空结果。基本上,如果我请求 7 天的结果,我应该得到 7 个结果,其中部分或全部可能不存在。

我试图用这个范围内的日期创建一个虚拟表,但我不知道如何将它与其他 sql 连接:

INSERT INTO #tempDates
SELECT  DATEADD(DAY, nbr - 1, @fromDate)
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
          FROM      sys.columns c
        ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @fromDate, @toDate)

任何帮助将不胜感激

【问题讨论】:

  • 请提供您的主数据表和结果表中的数据样本,以及该样本数据应如何查找您的最终结果。以declare @MainData table (Id int...); insert into @MainData values... 的形式进行

标签: sql sql-server


【解决方案1】:

将日期条件从WHERE 子句移至ON 子句:

SELECT MD.ID, MD.Name, RT.Result, RT.DateOn
FROM MainData MD
LEFT JOIN ResultsTable RT
    ON RT.MainDataID = MD.ID AND
       RT.DateOn BETWEEN @fromDate AND @toDate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多