此问题基于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 |...
答案 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
)