如果值不存在,如何连接两个表和 return 0?
how to join two tables and return 0 if value is not exists?
我有两个 table、hours
和 messages
hours
table 只有一列 hour
和 0~23 个值插入。
messages
table 也有 hour
列。
我正在尝试加入这些 table。但我的查询不起作用。
select hours.hour,ifnull(count(*),0) from hours left join messages on messages.hour = hours.hour group by hours.hour
样本数据在这里
消息Table
id text sender datetime hour
1 Hi, John Amy 2015-12-10 13:37:25 +0000 13
2 Yup Mike 2015-12-10 15:49:11 +0000 15
3 you there? Mike 2015-12-10 15:49:34 +0000 15
小时 Table
hour
0
1
2
3
4
..
23
我的查询结果
hour ifnull(count(*),0)
0 1
1 1
2 1
3 1
4 1
...
13 1
14 1
15 2
...
24 1
我想要的
hour ifnull(count(*),0)
0 0
1 0
2 0
3 0
...
13 1
14 0
15 2
...
24 0
如何连接两个 table 并获得如上所示的结果?
使用 CASE 条件和 Full Join 我们可以实现这个
DECLARE @Table1 TABLE
(id int, text varchar(8), sender varchar(4), datetime varchar(25), hour int)
;
INSERT INTO @Table1
(id, text, sender, datetime, hour)
VALUES
(1, 'Hi, John', 'Amy', '2015-12-10 13:37:25 +0000', 13),
(2, 'Yup', 'Mike', '2015-12-10 15:49:11 +0000', 15)
;
DECLARE @Table2 TABLE
(hour int)
;
INSERT INTO @Table2
(hour)
VALUES
(0),
(1),
(2),
(3),
(4),
(6),
(7),
(8),
(9),
(13),
(15),
(16),
(23)
;
Select T.hour,
CASE WHEN cnt <> 0 THEN
ROW_NUMBER()OVER(PARTITION BY T.cnt
ORDER BY (SELECT NULL))
ELSE CNT END cnt from (
select TT.hour,
CASE WHEN ISNULL(T.hour,0)<> 0
THEN 1 ELSE ISNULL(T.hour,0)
END cnt
from @Table1 T
FULL JOIN @Table2 TT
ON TT.hour = T.hour
)T
ORDER BY T.hour
我有两个 table、hours
和 messages
hours
table 只有一列 hour
和 0~23 个值插入。
messages
table 也有 hour
列。
我正在尝试加入这些 table。但我的查询不起作用。
select hours.hour,ifnull(count(*),0) from hours left join messages on messages.hour = hours.hour group by hours.hour
样本数据在这里
消息Table
id text sender datetime hour
1 Hi, John Amy 2015-12-10 13:37:25 +0000 13
2 Yup Mike 2015-12-10 15:49:11 +0000 15
3 you there? Mike 2015-12-10 15:49:34 +0000 15
小时 Table
hour
0
1
2
3
4
..
23
我的查询结果
hour ifnull(count(*),0)
0 1
1 1
2 1
3 1
4 1
...
13 1
14 1
15 2
...
24 1
我想要的
hour ifnull(count(*),0)
0 0
1 0
2 0
3 0
...
13 1
14 0
15 2
...
24 0
如何连接两个 table 并获得如上所示的结果?
使用 CASE 条件和 Full Join 我们可以实现这个
DECLARE @Table1 TABLE
(id int, text varchar(8), sender varchar(4), datetime varchar(25), hour int)
;
INSERT INTO @Table1
(id, text, sender, datetime, hour)
VALUES
(1, 'Hi, John', 'Amy', '2015-12-10 13:37:25 +0000', 13),
(2, 'Yup', 'Mike', '2015-12-10 15:49:11 +0000', 15)
;
DECLARE @Table2 TABLE
(hour int)
;
INSERT INTO @Table2
(hour)
VALUES
(0),
(1),
(2),
(3),
(4),
(6),
(7),
(8),
(9),
(13),
(15),
(16),
(23)
;
Select T.hour,
CASE WHEN cnt <> 0 THEN
ROW_NUMBER()OVER(PARTITION BY T.cnt
ORDER BY (SELECT NULL))
ELSE CNT END cnt from (
select TT.hour,
CASE WHEN ISNULL(T.hour,0)<> 0
THEN 1 ELSE ISNULL(T.hour,0)
END cnt
from @Table1 T
FULL JOIN @Table2 TT
ON TT.hour = T.hour
)T
ORDER BY T.hour