SQL如果没有可用的数据,如何强制显示0行?

时间:2017-09-22 21:09:33

标签: sql sql-server

我的表返回如下结果(如果HourOfDay没有特定ID的数据,则跳过行)

ID      HourOfDay   Counts
--------------------------
1         5           5
1         13          10
1         23          3
..........................HourOfDay up till 23
2         9           1

等等。

我想要实现的是强制显示为HoursOfDay显示0的行,这些行没有数据,如下所示:

ID      HourOfDay   Counts
--------------------------
1         0           0
1         1           0
1         2           0
1......................
1         5           5
1         6           0
1......................
1         23          3
2         0           0
2         1           0
etc.

我已经研究过它。看起来如果我创建一个额外的表并且外连接它,我可以实现这个结果。所以我在SP中创建了表变量(作为临时解决方法)

DECLARE @Hours TABLE
(
    [Hour]                      INT                 NULL
);
INSERT INTO @Hours VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)
                          ,(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23);

但是,无论我如何加入它,都无法达到预期的效果。

我该怎么办?我是否需要添加额外的列才能加入?完全不同的方法?任何正确方向的提示都值得赞赏!

1 个答案:

答案 0 :(得分:4)

对于加入Id的不同@Hours个十字架使用派生表,左边连接到您的表格:

select 
    i.Id
  , h.Hour
  , coalesce(t.Counts,0) as Counts
from (select distinct Id from t) as i
  cross join @Hours as h
  left join t 
    on i.Id = t.Id
   and h.Hour = t.HourOfDay

rextester演示:http://rextester.com/XFZYX88502

返回:

+----+------+--------+
| Id | Hour | Counts |
+----+------+--------+
|  1 |    0 |      0 |
|  1 |    1 |      0 |
|  1 |    2 |      0 |
|  1 |    3 |      0 |
|  1 |    4 |      0 |
|  1 |    5 |      5 |
|  1 |    6 |      0 |
|  1 |    7 |      0 |
|  1 |    8 |      0 |
|  1 |    9 |      0 |
|  1 |   10 |      0 |
|  1 |   11 |      0 |
|  1 |   12 |      0 |
|  1 |   13 |     10 |
|  1 |   14 |      0 |
|  1 |   15 |      0 |
|  1 |   16 |      0 |
|  1 |   17 |      0 |
|  1 |   18 |      0 |
|  1 |   19 |      0 |
|  1 |   20 |      0 |
|  1 |   21 |      0 |
|  1 |   22 |      0 |
|  1 |   23 |      3 |
|  2 |    0 |      0 |
|  2 |    1 |      0 |
|  2 |    2 |      0 |
|  2 |    3 |      0 |
|  2 |    4 |      0 |
|  2 |    5 |      0 |
|  2 |    6 |      0 |
|  2 |    7 |      0 |
|  2 |    8 |      0 |
|  2 |    9 |      1 |
|  2 |   10 |      0 |
|  2 |   11 |      0 |
|  2 |   12 |      0 |
|  2 |   13 |      0 |
|  2 |   14 |      0 |
|  2 |   15 |      0 |
|  2 |   16 |      0 |
|  2 |   17 |      0 |
|  2 |   18 |      0 |
|  2 |   19 |      0 |
|  2 |   20 |      0 |
|  2 |   21 |      0 |
|  2 |   22 |      0 |
|  2 |   23 |      0 |
+----+------+--------+