Mysql 从子查询获取计数

Mysql 从子查询获取计数,mysql,sql,Mysql,Sql,我有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 @Fil

我有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
declare@startedasvarchar(50)=null
将@end声明为varchar(50)=null
将@ClientCode声明为varchar(50)=null
将@FileName声明为varchar(50)=null
将@PageSize声明为int=null
选择Count(so.ID)作为TotalOrders,Count(p.ID)作为TotalParcels,
--将(状态1或状态2)计数为TotalNotDispatched,
--计数(so.Status=3左右,Status=8左右,Status=7)为TotalInError,
ir.ID、ir.Filename、ir.start、ir.Status、ir.ClientCode
来自导入记录ir(nolock)
将SiteOrder so与(nolock)连接
on so.ImportId=ir.ID
将地块p与(nolock)连接
在p.SiteOrderId=so.ID上
其中1=1
和ir.状态5--未删除
和(@ClientCode为null或ir.ClientCode=@ClientCode)
和(@Started为null或ir.Started=@Started)
和(@end为null或ir.end=@end)
和(@ClientCode为null或ir.ClientCode=@ClientCode)
和(@FileName为null或ir.FileName,如“%”++@FileName++“%”)
按ir.ID、ir.Filename、ir.Started、ir.Status、ir.ClientCode分组
按ir.ID描述订购

如果状态1或2为TotalNotDispatched且TotalInError的状态分别为3、7和8,如何返回所有SiteOrder的计数?

使用条件聚合
sum()
大小写

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;
选择Count(so.ID)作为TotalOrders,Count(p.ID)作为TotalParcels,
总和(如果状态不在(1,2)中,则为1,否则为0结束)为TotalNotDispatched,
总和(状态为(3、7、8)时,则为1,否则为0结束)作为TotalInError,
ir.ID、ir.Filename、ir.start、ir.Status、ir.ClientCode
从导入记录ir与(nolock)连接
SiteOrder so与(nolock)
on so.ImportId=ir.ID join
地块p(无锁)
在p.SiteOrderId=so.ID上
其中1=1
ir.状态5——未删除和
(@ClientCode为null或ir.ClientCode=@ClientCode)和
(@Started为null或ir.Started=@Started)和
(@end为null或ir.end=@end)和
(@ClientCode为null或ir.ClientCode=@ClientCode)和
(@FileName为null或ir.FileName,如“%”++@FileName++“%”)
按ir.ID、ir.Filename、ir.Started、ir.Status、ir.ClientCode分组
按ir.ID desc订购;

我怀疑你的前两个价值观是你想要的
TotalOrders
TotalParcels
通常具有相同的值。为什么?
COUNT()
统计非
NULL
值的数量,并且
id
s通常不是
NULL

您使用的是哪种SQL实现?