请考虑这个脚本:
declare @Days table
([Day] int)
insert @Days values(1),(2),(3),(4),(5)
declare @Data table
(
ID int,
[Day] int,
[Name] Nvarchar(50),
[Status] bit
)
insert into @Data
values(1,1,'Nima',1),(2,2,'Arian',1),(3,2,'Nima2',0),(4,2,'Nima3',1),(5,3,'Nima4',0)
select y.[Day],count(Id)
from @Days y left join @Data d
on y.[Day] = d.[Day]
where Status=1
group by y.[Day]
此查询有以下结果:
Day (No column name)
1 1
2 2
但我想要这个结果:
Day (No column name)
1 1
2 2
3 0
4 0
5 0
如何重写上述查询以获得上述结果。
感谢
答案 0 :(得分:2)
将where
子句中的条件移动到left join
的条件。在编写查询时,where
子句会过滤掉具有空值的行(并将左连接转换为内连接)。
select y.[Day],count(Id)
from @Daye y
left join @Data d on y.[Day] = d.[Day] and d.Status=1
group by y.[Day]
答案 1 :(得分:0)
您可以仅将group by
子句应用于@Data
表,并将结果保留在@Daye
表中:
SELECT y.[Day], count(Id)
FROM @Daye y
LEFT JOIN (SELECT [Day], COUNT([Id]) AS cnt
FROM @Daye
WHERE [Status] = 1
GOURP BY [Day]) d ON y.[Day] = d.[Day]