2017-08-31 12 views
0

私は宅配便の問題を1つ解決しています。それらは異なる経路を持ち、各経路はn個の小包を持つことができます。彼らは1つの袋に2小包を配置しています。クエリの下に使用して別の列の値でグループを使用して列の値を更新

Route | ParcelId | GroupId | 
-------|----------|--------- 
NORTH | P1  | 1 | 
NORTH | P2  | 1 | 
NORTH | P3  | 2 | 
NORTH | P4  | 2 | 
NORTH | P5  | 3 | 
EAST | P6  | 1 | 
EAST | P7  | 1 | 
EAST | P8  | 2 | 
CENTRAL| P9  | 1 | 
CENTRAL| P10  | 1 | 
CENTRAL| P11  | 2 | 
CENTRAL| P11  | 2 | 
-------|----------|---------| 

:私のようなデータを得ることができた

select 
Route, ParcelId 
    -- calculate the group number for every 2 parcels, increment 1 
    ceiling(row_number() over(partition by route order by ParcelId)/2.0) GroupId 
from Parcel (nolock) 
where 
    ship_date = cast(getdate() as date) 

ここで小包P1、P2は、北ルートとP6から、P7は東ルートから同じグループIDを持っています。 しかし、N1、N2、N3(北ルートの場合)、E1、E2(東ルートの場合)を得ることができれば、わずか1/2/3の代わりにRouteに基づいて小包のユニークな識別子が必要です。小包を小包の中に並べる間に

だから私は、結果セットがのようになりますしたい:正確にN1/E1/C1ない場合

Route | ParcelId | GroupId | 
-------|----------|--------- 
NORTH | P1  | N1 | 
NORTH | P2  | N1 | 
NORTH | P3  | N2 | 
NORTH | P4  | N2 | 
NORTH | P5  | N3 | 
EAST | P6  | E1 | 
EAST | P7  | E1 | 
EAST | P8  | E2 | 
CENTRAL| P9  | C1 | 
CENTRAL| P10  | C1 | 
CENTRAL| P11  | C2 | 
CENTRAL| P11  | C2 | 
-------|----------|---------| 

..識別子は(ルートに基づいて)ユニークである必要があり、私は小包のテーブルの上にいくつかの空のフィールドを更新する必要があります、同じもののための更新スクリプトが必要になります。

いずれのリードも高く評価されます。

おかげで、

+0

編集のためにSagar Gangwalさんに感謝します。 –

答えて

0
select 
Route, ParcelId,CONCAT(CASE WHEN ROUTE='NORTH' THEN 'N' WHEN ROUTE='EAST' THEN 'E' WHEN ROUTE='WEST' THEN 'W' WHEN ROUTE='SOUTH' THEN 'S' WHEN ROUTE='CENTRAL' THEN 'C' END,GroupId) AS GroupId 
from Parcel 
where ship_date = cast(getdate() as date) 

あなたは、クエリの上に試すことができます。

+1

Arrr!それはとてもシンプルで、私はストーリーを書くのにとても時間を無駄にしました! Sagarに感謝します。あなたはロック! –

関連する問題