时间:2015-09-27 11:28:03

标签: sql sql-server sql-server-2008

请考虑这个脚本:

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

如何重写上述查询以获得上述结果。

感谢

2 个答案:

答案 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]