SQL多对多分组到一行
我确实使用了搜索,但少数结果似乎没有回答我的具体问题(或者我的sql技能不足以将答案应用到我的场景中) 我有一些桌子需要加入。上下文是一个交付业务。一个表包含交付轮时间表。从这张表中我只需要客户签署每周交货的日期。这是在帐号上加入的 另一个表包含,帐号,交货日期实例等 我想做的是提取过去6周内每个账号的平均发货数量。但仅适用于开始日期在6到10周前的帐户 我正在使用的代码似乎带回了正确的日期范围,但是,我需要每个帐号有一行,在6周内有一个平均交付次数。我使用的代码不能正确执行此操作 非常感谢您的帮助 谢谢SQL多对多分组到一行,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我确实使用了搜索,但少数结果似乎没有回答我的具体问题(或者我的sql技能不足以将答案应用到我的场景中) 我有一些桌子需要加入。上下文是一个交付业务。一个表包含交付轮时间表。从这张表中我只需要客户签署每周交货的日期。这是在帐号上加入的 另一个表包含,帐号,交货日期实例等 我想做的是提取过去6周内每个账号的平均发货数量。但仅适用于开始日期在6到10周前的帐户 我正在使用的代码似乎带回了正确的日期范围,但是,我需要每个帐号有一行,在6周内有一个平均交付次数。我使用的代码不能正确执行此操作 非常感谢您的
select mov.AccountNumber,
sch.contractStart,
mov.TypeOfMovement,
mov.Outlet,
mov.RoundName,
mov.VehicleType,
avg(mov.NumberofItems)
FROM [round_movements]mov
left outer join [schedule]sch on sch.AccountNumber=
mov.AccountNumber
where mov.outlet='County'
and DATEDIFF(week, sch.ContractStart,GETDATE()) in(10,9,8,7,6)
and DATEDIFF(week, mov.RoundDate,GETDATE()) in (6,5,4,3,2,1,0)
group by
mov.AccountNumber,
mov.RoundName,
sch.contractStart,
mov.TypeOfMovement,
mov.Outlet,
mov.VehicleType,
mov.NumberofItems
order by mov.AccountNumber
以上代码的结果:
════════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No of Items ║
╠════════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town1 E4 (Wednesday) sprinter 1 ║
║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
╚════════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town 1 E4 (Wednesday) sprinter 1 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ ║
╚═════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║
4000461 27/11/2013 Bristol E4 (Wednesday) RCV 1
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
║
╚═════════════════════════════════════════════════════════════════════════════════════╝
预期结果:
════════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No of Items ║
╠════════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town1 E4 (Wednesday) sprinter 1 ║
║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
╚════════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town 1 E4 (Wednesday) sprinter 1 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ ║
╚═════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║
4000461 27/11/2013 Bristol E4 (Wednesday) RCV 1
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
║
╚═════════════════════════════════════════════════════════════════════════════════════╝
做出Rs建议的更改后的结果:
════════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No of Items ║
╠════════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town1 E4 (Wednesday) sprinter 1 ║
║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
╚════════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║ 4000461 27/11/2013 town 1 E4 (Wednesday) sprinter 1 ║
║ 6382401 29/10/2013 town2 E1 (Thursday) sprinter 2 ║
║ ║
╚═════════════════════════════════════════════════════════════════════════════════════╝
╔═════════════════════════════════════════════════════════════════════════════════════╗
║ AccountNumber contractStart Outlet RoundName VehicleType Avg No Items ║
╠═════════════════════════════════════════════════════════════════════════════════════╣
║
4000461 27/11/2013 Bristol E4 (Wednesday) RCV 1
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
6382401 29/10/2013 Bristol E1 (Thursday) RCV 2
║
╚═════════════════════════════════════════════════════════════════════════════════════╝
尝试此操作,从分组方式列列表中删除
mov.NumberofItems
select mov.AccountNumber,
sch.contractStart,
mov.TypeOfMovement,
mov.Outlet,
mov.RoundName,
mov.VehicleType,
avg(mov.NumberofItems)
FROM [round_movements]mov
left outer join [schedule]sch on sch.AccountNumber=
mov.AccountNumber
where mov.outlet='County'
and DATEDIFF(week, sch.ContractStart,GETDATE()) in(10,9,8,7,6)
and DATEDIFF(week, mov.RoundDate,GETDATE()) in (6,5,4,3,2,1,0)
group by
mov.AccountNumber,
mov.RoundName,
sch.contractStart,
mov.TypeOfMovement,
mov.Outlet,
mov.VehicleType
order by mov.AccountNumber
我可以看到一些事情会阻止你得到你期望的结果
select
mov.AccountNumber,
min(sch.contractStart),
mov.TypeOfMovement,
mov.Outlet,
mov.RoundName,
mov.VehicleType,
avg(mov.NumberofItems)
FROM
[round_movements]mov
left outer join [schedule]sch on sch.AccountNumber=mov.AccountNumber
where
mov.outlet='County'
and DATEDIFF(week, sch.ContractStart,GETDATE()) in(10,9,8,7,6)
and DATEDIFF(week, mov.RoundDate,GETDATE()) in (6,5,4,3,2,1,0)
group by
mov.AccountNumber,
mov.RoundName,
mov.TypeOfMovement,
mov.Outlet,
mov.VehicleType,
mov.NumberofItems
order by
mov.AccountNumber
除了其他人所说的之外: 您得到多个结果的原因是
sch。contractStart
对于两个记录的两个帐号是不同的。您可以做的是在
MAX()
中包装sch.contractStart
,并将其从分组中删除。这将为您提供特定账号的最新合同开始日期,我认为从逻辑角度来看这是有意义的
编辑-在OP的问题之后编辑
我可以看到更新的结果,有2个完全相同的记录。
您可以将整个内容包装到选择DISTINCT
中,以消除该问题。但这不是正确的方法
实际上,如果所有内容都在GROUPBY或AGGRATE函数中,我看不出有任何重复记录的原因。
您是否已将mov.NumberofItems
从分组依据中删除?分组依据AccountNUmber、contractStart、outlet、RoundName我添加了sql server标记,因为查询语法强烈建议使用sql server。抱歉。我正在使用SQLServer2008R2。Thank.remove mov.NumberofItems from group by columns ListThank rs.我试图删除此项,但每个帐号仍有多行:(感谢您的快速回复。我从group by中删除了项目数,但每个帐号仍有多行:(我补充了原来的问题-正如您所看到的,每个帐号至少有一行-它似乎重复了每个帐号的平均项数。再次感谢您的帮助基于新结果集的预期结果是什么?不清楚您尝试按哪些列分组或返回平均数据。是否要继续返回最小合同开始日期和平均项目数?真的很抱歉,我原来的问题的结果不正确(我认为是旧代码)。我已更新,以显示我的代码生成的内容、您的建议和我需要的内容。我只需要按帐号分组,并显示在所有日期交付的所有项目的平均值。非常感谢。谢谢-我的代码与上面相同,但结果仍与上面相同-与Rs的建议相同-每个帐户多行重复d平均项目数:(非常讨厌的sorryRs的建议不包括合同开始日期的最小值(sch.contractStart)。您获得额外行的原因是因为日期不相同,所以当我使用最小值()时,您会为每个项目获得单独的行)结果是一样的,因为每个帐户只有一个合同开始日期。有多个循环日期,但只有一个合同开始日期,并且还从groupby
中删除mov.NumberofItems
。它已经包装在聚合函数中谢谢。我认为在运行原始代码时数据集有错误。当我e-ran每个账号只有一个合同开始日期。我已经用这个更新了我的原始问题。很抱歉让你更难理解