Sql server T-SQL聚合查询不工作

Sql server T-SQL聚合查询不工作,sql-server,tsql,aggregate-functions,Sql Server,Tsql,Aggregate Functions,我试图根据发货日期找到所有迟交的包裹和包裹项目的总和。这是我到目前为止所做的,在最后一次聚合查询中计数不正确。我预计包裹ID 123456和今天到期装运的包裹项目计数为1。今天的日期是2015年6月27日 下面是我一直停留在的示例代码 WHName和WHId表示仓库名称和Id 非常感谢你的帮助 use test go create table #packages ( PackageId int , WHName varchar(100), WHId int, ShipByDa

我试图根据发货日期找到所有迟交的包裹和包裹项目的总和。这是我到目前为止所做的,在最后一次聚合查询中计数不正确。我预计包裹ID 123456和今天到期装运的包裹项目计数为1。今天的日期是2015年6月27日

下面是我一直停留在的示例代码 WHName和WHId表示仓库名称和Id 非常感谢你的帮助

 use test
go

create table #packages
(
  PackageId int ,
  WHName varchar(100),
  WHId int,
  ShipByDate date
)

insert into #packages 
values
(
  123,
  'JAX',
  1,
  '06/25/2015'
),
(
  1234,
  'OH',
  2,
  '06/26/2015'
),
(
  12345,
  'JAX',
  1,
  '06/24/2015'
),
(
  123456,
  'DS',
  3,
  '06/27/2015'
),
(
  1234567,
  'DS',
  3,
  '06/27/2015'
  ),
  (
  12345678,
  'DS',
  3,
  '06/27/2015'
  )



create table #packageItems
(
 PackageItemId int,
 PackageId int,
 Qty int
)

insert into #PackageItems

values
(
  1,
  123,
  2
),
(
  2,
  12345678,
  0
),
(
 3,
 1234,
 3
),
(
 4,
 12345,
 2
),
(
 5,
 123,
 3
),
(
 6,
 123456,
 3

),
(
7,
12345,
10
)

create table #PackageSum
(
  PackageId int,
  ItemsCount int
)

insert into #PackageSum(PackageId,ItemsCount)

select
    pki.PackageId,
    count(pki.PackageItemId) as Items
from
    #packageItems pki
inner join #packages pk
    on pki.PackageId = pk.PackageId
where
    pki.Qty > 0

group by
    pki.PackageId




select * from #Packages
select * from #PackageItems
select * from #PackageSum

declare @Now datetime2(7) = getdate();

select  
    pk.WHName,
    SUM(case when datediff(day,pk.ShipByDate,@Now) = 0 then 1 else 0 end) as PackagesDueToday,
    SUM(case when datediff(day,pk.ShipByDate,@Now)  = 0 then pks.ItemsCount else 0 end) as PackageItemsDueToday,
    SUM(case when datediff(day,pk.ShipByDate,@Now) between 1 and 2  then 1 else 0 end) as Packages1To2DaysOld,  
    SUM(case when datediff(day,pk.ShipByDate,@Now) between 1 and 2  then pks.ItemsCount else 0 end) as PackageItems1To2DaysOld,
    SUM(case when datediff(day,pk.ShipByDate,@Now) between 2 and 3  then 1 else 0 end) as Packages2To3DaysOld,  
    SUM(case when datediff(day,pk.ShipByDate,@Now) between 2 and 3  then pks.ItemsCount else 0 end) as PackageItems2To3DaysOld
from
    #packages pk
inner join #PackageSum pks
    on pk.PackageId = pks.PackageId
group by
pk.WHName



drop table  #packages
drop table #PackageItems

drop table #PackageSum

--=============================== Another way of doing he same above=====================================
use test
go

create table #packages
(
  PackageId int ,
  WHName varchar(100),
  WHId int,
  ShipByDate date
)

insert into #packages 
values
(
  123,
  'JAX',
  1,
  '06/25/2015'
),
(
  1234,
  'OH',
  2,
  '06/26/2015'
),
(
  12345,
  'JAX',
  1,
  '06/24/2015'
),
(
  123456,
  'DS',
  3,
  '06/27/2015'
),
(
  1234567,
  'DS',
  3,
  '06/28/2015'
  ),
  (
  12345678,
  'DS',
  3,
  '06/18/2015'
  )



create table #packageItems
(
 PackageItemId int,
 PackageId int,
 Qty int
)

insert into #PackageItems

values
(
  1,
  123,
  2
),
(
  2,
  1234567,
  3
),
(
  2,
  12345678,
  3
),
(
 3,
 1234,
 3
),
(
 4,
 12345,
 2
),
(
 5,
 123,
 3
),
(
 6,
 123456,
 3

),
(
7,
12345,
10
)

create table #PackageSum
(
  PackageId int,
  ItemsCount int
)

insert into #PackageSum(PackageId,ItemsCount)

select
    pki.PackageId,
    count(pki.PackageItemId) as Items
from
    #packageItems pki
inner join #packages pk
    on pki.PackageId = pk.PackageId
where
    pki.Qty > 0

group by
    pki.PackageId




select * from #Packages
select * from #PackageItems
select * from #PackageSum

declare @Today date = getdate();
declare @Yesterday date = dateadd(day,-1,@Today);
declare @2DaysOld  date = dateadd(day,-2,@Today);
declare @3daysOld  date = dateadd(day,-3,@Today);
declare @5daysOld  date = dateadd(day,-5,@Today);


--select @Now

select  
    pk.WHName,
    SUM(case when pk.ShipByDate = @Today then 1 else 0 end) as PackagesDueToday,
    SUM(case when pk.ShipByDate = @Today then pks.ItemsCount else 0 end) as PackageItemsDueToday,
    SUM(case when pk.ShipByDate >= @2DaysOld and pk.ShipByDate <= @Yesterday then 1 else 0 end) as Packages1To2DaysOld, 
    SUM(case when pk.ShipByDate >= @2DaysOld and pk.ShipByDate <= @Yesterday then   pks.ItemsCount else 0 end) as PackageItems1To2DaysOld,
    SUM(case when pk.ShipByDate >= @3daysOld and pk.ShipByDate <= @2DaysOld   then 1 else 0 end) as Packages2To3DaysOld,    
    SUM(case when pk.ShipByDate >= @3daysOld and pk.ShipByDate <= @2DaysOld   then pks.ItemsCount else 0 end) as PackageItems2To3DaysOld,
    SUM(case when pk.ShipByDate <= @5daysOld then 1 else 0 end) as Packages5DaysAndOLder,
    SUM(case when pk.ShipByDate <= @5daysOld then pks.ItemsCount  else 0 end) as PackageItems5DaysAndOLder
from
    #packages pk
inner join #PackageSum pks
    on pk.PackageId = pks.PackageId
group by
pk.WHName



drop table  #packages
drop table #PackageItems

drop table #PackageSum

+1用于详细的脚本和示例数据。但是我没有完全理解你的期望。这里是27号,或者是几秒钟前。如果你也是这样的话,我希望当天的包裹数量是两个,这两个都是3号仓库的。顺便说一下,在一个更规范化的数据库中,您可以将仓库名称及其id存储在一个单独的表中,并且在包中只包含warehouseid-edit-nevermind,第二个包没有项目,因此它不会从连接中返回。@Golez,我完全同意noramalized warehouse选项卡。我只是将其扔到那里,只是为了让事情变得简单。非常感谢您的帮助。我发现了问题所在。最后,我在聚合查询中使用了错误的别名。问题解决了