2015-09-27 54 views
3

請考慮此腳本:保留組左表由

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

移動狀態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] 
+0

太好了! 。但是,你能解釋一下這個sql server的行爲嗎? – Arian

+1

@Kerezo對於左側沒有匹配的行,_status_列的值將爲空。 where子句在連接之後應用,因此會過濾掉空值。通過使其成爲連接條件的一部分,左連接將返回左側的所有行以及與日期和狀態條件匹配的行。 – jpw

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]