SQL多对多分组到一行

SQL多对多分组到一行,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我确实使用了搜索,但少数结果似乎没有回答我的具体问题(或者我的sql技能不足以将答案应用到我的场景中) 我有一些桌子需要加入。上下文是一个交付业务。一个表包含交付轮时间表。从这张表中我只需要客户签署每周交货的日期。这是在帐号上加入的 另一个表包含,帐号,交货日期实例等 我想做的是提取过去6周内每个账号的平均发货数量。但仅适用于开始日期在6到10周前的帐户 我正在使用的代码似乎带回了正确的日期范围,但是,我需要每个帐号有一行,在6周内有一个平均交付次数。我使用的代码不能正确执行此操作 非常感谢您的

我确实使用了搜索,但少数结果似乎没有回答我的具体问题(或者我的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

我可以看到一些事情会阻止你得到你期望的结果

  • 您不需要组中的mov.NumberofItems by,因为您是在求平均值
  • 您需要使用MIN函数给出第一个合同开始日期,例如MIN(sch.contractStart),然后您就不需要在group by中使用sch.contractStart 这会给你你期望的结果

    因此,您的查询将是这样的

    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每个账号只有一个合同开始日期。我已经用这个更新了我的原始问题。很抱歉让你更难理解