2014-01-10 59 views
0

我沒有使用搜索,但爲數不多的結果似乎並沒有回答我的具體問題(或我的SQL技能是不夠好,適用的答案,我的方案)SQL多對多分組到一排

我有我需要加入的桌子。背景是交付業務。一個表格包含交付回合計劃。我從這張表中所需要的是客戶註冊每週交貨的日期。這是加入了帳號。

其他表中包含的賬號,交貨日期等情況

我所希望做的是提取交付給每一個帳戶的平均數量在過去的6周。但僅適用於開始日期介於6至10周之前的帳戶。

我正在使用的代碼似乎帶回了正確的日期範圍,但是,我需要爲每個帳戶編號一行,並且爲期六週的期限內的平均交付次數。我正在使用的代碼不能正確執行此操作。

任何幫助,非常感謝。

THANKYOU

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    ║ 
║   ║ 
╚═════════════════════════════════════════════════════════════════════════════════════╝ 

找零sugges後結果下面泰德盧比:

╔═════════════════════════════════════════════════════════════════════════════════════╗ 
║ 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 

      ║ 
╚═════════════════════════════════════════════════════════════════════════════════════╝ 
+0

按帳戶分組十月,contractStart,outlet,roundname – user1336827

+0

我添加了sql-server標記,因爲查詢語法強烈建議SQL Server。 –

+0

對不起。我正在使用SQL Server 2008 R2。謝謝。 – user3103335

回答

0

試試這個,按列列表

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 
+0

感謝您的快速回復。我從組中刪除了多個項目,但仍然獲得多個行每個帳戶:( – user3103335

+0

@ user3103335,你可以發佈結果從更新的查詢? –

+0

我添加到原來的問題 - 正如你可以看到有多個行直到每個帳戶號碼 - 它似乎重複平均每個帳號的項目沒有項目。再次感謝您的幫助 – user3103335

0

從組中刪除mov.NumberofItems我可以看到一對夫婦的事情,這將阻止你得到您所期望的結果。

  1. 您不需要組中的mov.NumberofItems,因爲您正在平均它。
  2. 您需要使用MIN函數給出第一個合約開始日期,例如min(sch.contractStart),然後您不需要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 
+0

Thankyou - 我的代碼與上面相同,但結果仍然如上 - 與Rs的建議相同 - 每個帳戶重複平均不超過一行的項目:(真的很討厭對不起 – user3103335

+0

Rs的建議不包括最小值(sch.contractStart)合同開始日期 – Nirav24x7

+0

您得到額外行的原因是因爲日期不相同所以您得到一個單獨的行每個 – Nirav24x7

0

追加到其他人所說:

原因你得到多個結果是sch.contractStart是2個記錄2個賬號不同。
你可以做的是把sch.contractStart換成MAX()並從GROUP BY中刪除它。這將爲您提供特定帳號的最新合約開始日期,從邏輯角度來看,我認爲這是合理的。

編輯 - OP的問題編輯
我可以更新的結果看後,有2分完全相同的記錄。 你可以把整個東西包裝成SELECT DISTINCT消除。但那不是正確的方法。

實際上,如果所有內容都是分組或聚合函數,我不會看到重複記錄的任何原因。 您是從GROUP BY中刪除mov.NumberofItems嗎?

+0

並且還從'GROUP BY'中刪除'mov.NumberofItems'。它已經包含在聚合函數 – tumchaaditya

+0

Thankyou中。我認爲數據集有一個當我運行原始代碼時出現錯誤當我重新運行時,每個帳號只有一個合同開始日期,我已經更新了m y原來的問題。反過來讓你更難 – user3103335