SQL Server 2005,年初至今每月计数,按供应商分组,并在结果中包含计数为零时
我有一个问题,我正在计算任何给定客户每月的年初至今报告的不同索赔数量。但我发现,如果客户在这一年中没有任何索赔(因此每个月应显示为0),那么客户根本不会出现在结果集中。我需要客户端显示当月的“0”计数。有人知道怎么做吗?谢谢你的帮助!:) 我的查询类似于:SQL Server 2005,年初至今每月计数,按供应商分组,并在结果中包含计数为零时,sql,sql-server-2005,Sql,Sql Server 2005,我有一个问题,我正在计算任何给定客户每月的年初至今报告的不同索赔数量。但我发现,如果客户在这一年中没有任何索赔(因此每个月应显示为0),那么客户根本不会出现在结果集中。我需要客户端显示当月的“0”计数。有人知道怎么做吗?谢谢你的帮助!:) 我的查询类似于: Select c.client_name, SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 1 THEN 1 ELSE 0 END) AS [Jan-13], SUM(CASE DATEPART
Select c.client_name,
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 1 THEN 1 ELSE 0 END) AS [Jan-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 2 THEN 1 ELSE 0 END) AS [Feb-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 3 THEN 1 ELSE 0 END) AS [Mar-13] etc.....
From Client c (Nolock)
inner join claim c2 (nolock)
on c.client_id = c2.client_id
Where c.client_id IN (1,3,4,5,7) AND
c2.DateField between '001-01-2013' and Getdate()
GROUP BY c.client_name
ORDER BY c.Client_name
我的结果如下:
Client Name|Jan-13|Feb-13|Mar-13|etc.....
abc company|12 |17 |0 |etc......
zzz company|3 |0 |15 |etc...
Client Name|Jan-13|Feb-13|Mar-13|etc.....
abc company|12 |17 |0 |etc......
rad company|0 |0 |0 |etc.....
zzz company|3 |0 |15 |etc...
我需要的结果如下所示:
Client Name|Jan-13|Feb-13|Mar-13|etc.....
abc company|12 |17 |0 |etc......
zzz company|3 |0 |15 |etc...
Client Name|Jan-13|Feb-13|Mar-13|etc.....
abc company|12 |17 |0 |etc......
rad company|0 |0 |0 |etc.....
zzz company|3 |0 |15 |etc...
您正在使用
内部联接
,它将仅在索赔表中存在匹配记录时才返回客户表中的记录,并将其替换为左侧外部联接
,它将根据WHERE子句和索赔表列中的联接提供客户表中的所有记录
此查询将加入,然后进行筛选
Select c.client_name,
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 1 THEN 1 ELSE 0 END) AS [Jan-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 2 THEN 1 ELSE 0 END) AS [Feb-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 3 THEN 1 ELSE 0 END) AS [Mar-13]
etc.....
From Client c (Nolock)
left outer join claim c2 (nolock)
on c.client_id = c2.client_id
Where c.client_id IN (1,3,4,5,7) AND
( c2.DateField between '01-01-2013' and Getdate() OR c2.DateField IS NULL )
GROUP BY c.client_name
ORDER BY c.Client_name
或者此查询将在以下情况之前筛选索赔行——
Select c.client_name,
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 1 THEN 1 ELSE 0 END) AS [Jan-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 2 THEN 1 ELSE 0 END) AS [Feb-13],
SUM(CASE DATEPART(MONTH,c2.DateField)WHEN 3 THEN 1 ELSE 0 END) AS [Mar-13]
etc.....
From Client c (Nolock)
left outer join claim c2 (nolock)
on c.client_id = c2.client_id
AND c2.DateField between '01-01-2013' and Getdate()
Where c.client_id IN (1,3,4,5,7)
GROUP BY c.client_name
ORDER BY c.Client_name
这可能有用
Select
c.client_name,
Sum(Case Month(c2.DateField) When 1 Then 1 Else 0 End) As [Jan-13],
Sum(Case Month(c2.DateField) When 2 Then 1 Else 0 End) As [Feb-13],
Sum(Case Month(c2.DateField) When 3 Then 1 Else 0 End) As [Mar-13],...
From
Client c With (Nolock)
left outer join
Claim c2 With (nolock)
On c.client_id = c2.client_id And
c2.DateField between '01-01'2013' and GetDate() -- putting it here makes the outer join apply after the filter
Where
c.client_id IN (1,3,4,5,7)
Group By
c.client_name
Order By
c.Client_name
否则,您需要在筛选声明的子查询上保留外部联接。无论哪种方法,诀窍都是确保在外部表上的筛选器之后应用左外部联接。非常感谢@Lobo,我也尝试了左外部联接,但仍然无法获得该年零记录的客户机。这两位失踪的客户没有2013年的任何记录,因此没有任何记录可查。但我仍然需要每个月显示0(@Montwill我更改了查询。如果没有索赔行,
DateField
将为空。