如果没有可用的数据,SQL会强制一行0,

时间:2017-10-30 16:54:04

标签: sql sql-server

此问题基于my previous question;但是,这里的情况不同。

在我之前的问题中,我需要强制显示任何没有计数的行的0。交叉连接和左连接为我创造了奇迹,我多次使用它。

但是,在之前的情况下,有一些初始数据要加入(例如,存在24行中的3个)。

在我目前的情况下,查询返回一行。

SELECT ID, StartDate, EndDate, Year, Counts1, Counts2, etc
WHERE data between @startdate and @enddate

如果数据在所选范围内 - 好,如果没有 - 则不返回任何数据。这就是我遇到问题的地方。如果没有数据,我就无法加入。所以我怀疑我以前的方法在这里有用。

在插入表变量

期间,我也尝试过合并
INSERT INTO @table SELECT ID, StartDate, EndDate, Year, COALESCE(Counts1, 0) as Counts1, etc
WHERE data between @startdate and @enddate

我提出的最后手段是“与不存在的地方结合”,但到目前为止我还没有得出结果。

有人可以告诉我如何处理这种情况吗?如果行不存在,我想要的输出是

|id   |Start Date   |End Date   |Year   |   Counts1|   Counts2|...
|Text |@startdateval|@enddateval|yearval|      0   |     0    |...

2 个答案:

答案 0 :(得分:0)

您可以使用聚合。 。 。如果你总是想要一行:

SELECT max(ID) as id, @startdate as startdate, @enddate as enddate,
       max(Year) as year, coalesce(max(Counts1), 0) as counts1, coalesce(max(Counts2), 0), etc
. . .
WHERE data between @startdate and @enddate;

如果您的原始查询返回超过1行,则无法执行此操作。

答案 1 :(得分:0)

如果我正确理解了您的问题,您可以使用递归CTE创建日期范围内所有日期的虚拟表格,然后将其连接到您的表格中:

declare @startDate date = '2017-10-01'
,@endDate date = '2017-10-31'
;with d as(
SELECT @startDate SD
UNION ALL
SELECT dateadd(day,1,SD)
FROM d
WHERE SD < @endDate
)