2017-03-01 62 views
0

我有3個表ImportRecord,SiteOrder和Parcel其中ImportRecord.ID = SiteOrder.ImportId和SiteOrder.ID = Parcel.SiteOrderId。從子查詢獲得計數

我需要一個查詢檢索以下:

declare @Started as varchar(50) = null 
declare @Ended as varchar(50) = null 
declare @ClientCode as varchar(50) = null 
declare @FileName as varchar(50) = null 
declare @PageSize as int = null 

select Count(so.ID) as TotalOrders, Count(p.ID) as TotalParcels,    
     --Count(so.Status <> 1 or so.Status <> 2) as TotalNotDespatched, 
     --Count(so.Status = 3 or so.Status = 8 or so.Status = 7) as TotalInError,   
     ir.ID, ir.Filename, ir.Started, ir.Status, ir.ClientCode 
from ImportRecord ir with (nolock) 
join SiteOrder so with (nolock) 
    on so.ImportId = ir.ID 
join Parcel p with (nolock) 
    on p.SiteOrderId = so.ID 
where 1=1 
    and ir.Status <> 5 --NOT DELETED 
    and (@ClientCode is null or ir.ClientCode = @ClientCode) 
    and (@Started is null or ir.Started = @Started) 
    and (@Ended is null or ir.Ended = @Ended) 
    and (@ClientCode is null or ir.ClientCode = @ClientCode) 
    and (@FileName is null or ir.Filename like '%' + @FileName + '%') 
group by ir.ID, ir.Filename, ir.Started, ir.Status, ir.ClientCode 
order by ir.ID desc 

如何返回所有siteorders的計數,其中狀態<> 1或<> 2這是TotalNotDespatched並且其中狀態= 3, 7和8的TotalInError?

+0

您正在使用哪種SQL實現? – WilliamD

回答

1

使用條件聚合。 。 。 sum()case

select Count(so.ID) as TotalOrders, Count(p.ID) as TotalParcels,    
     sum(case when so.Status not in (1, 2) then 1 else 0 end) as TotalNotDespatched, 
     sum(case when so.Status in (3, 7, 8) then 1 else 0 end) as TotalInError,   
     ir.ID, ir.Filename, ir.Started, ir.Status, ir.ClientCode 
from ImportRecord ir with (nolock) join 
    SiteOrder so with (nolock) 
    on so.ImportId = ir.ID join 
    Parcel p with (nolock) 
    on p.SiteOrderId = so.ID 
where 1=1 
     ir.Status <> 5 --NOT DELETED and 
     (@ClientCode is null or ir.ClientCode = @ClientCode) and 
     (@Started is null or ir.Started = @Started) and 
     (@Ended is null or ir.Ended = @Ended) and 
     (@ClientCode is null or ir.ClientCode = @ClientCode) and 
     (@FileName is null or ir.Filename like '%' + @FileName + '%') 
group by ir.ID, ir.Filename, ir.Started, ir.Status, ir.ClientCode 
order by ir.ID desc; 

我懷疑你的前兩個值是你想要什麼。 TotalOrdersTotalParcels通常具有相同的值。爲什麼? COUNT()計算非NULL值的數量,而id通常不是NULL