2列

2017-02-04 1 views
0

私はテーブルや価値観の下に持っていると私は期待出力に以下のような出力をしたいと行番号を使用して同じシーケンス番号を設定する方法2列

declare @TestData table (ID int, sku char(6), product varchar(15)) 
insert into @TestData values (1 , 'ABDE01'  ,'SPA') 
insert into @TestData values (2 , 'ABDE01'  ,'GRE') 
insert into @TestData values (3 , 'ABDE01'  ,'RUS') 
insert into @TestData values (2 , 'ABAD03'  ,'SPA') 
insert into @TestData values (4 , 'ABAD03'  ,'SPA') 
insert into @TestData values (6 , 'ABAD03'  ,'SPA') 
insert into @TestData values (1 , 'ABAD02'  ,'SPA') 
insert into @TestData values (2 , 'ABAD02'  ,'SPA') 
insert into @TestData values (4 , 'ABAD05'  ,'ENG') 

として期待される出力:

SKU Product NewRow 
ABAD02 SPA 1 
ABAD02 SPA 1 
ABAD02 ENG 2 
ABAD03 SPA 1 
ABAD03 SPA 1 
ABAD03 SPA 1 
ABDE01 SPA 1 
ABDE01 GRE 2 
ABDE01 RUS 3 

I次のクエリを試しましたが、期待どおりに動作していないと私は私が望んでいたものと私を与えました

declare @TestData table (ID int, sku char(6), product varchar(15)) 
insert into @TestData values (1 , 'ABDE01'  ,'SPA') 
insert into @TestData values (2 , 'ABDE01'  ,'GRE') 
insert into @TestData values (3 , 'ABDE01'  ,'RUS') 
insert into @TestData values (2 , 'ABAD03'  ,'SPA') 
insert into @TestData values (4 , 'ABAD03'  ,'SPA') 
insert into @TestData values (6 , 'ABAD03'  ,'SPA') 
insert into @TestData values (1 , 'ABAD02'  ,'SPA') 
insert into @TestData values (2 , 'ABAD02'  ,'SPA') 
insert into @TestData values (4 , 'ABAD02'  ,'ENG') 


SELECT 
    dt.SKU, dt.Product, NewRow 
    FROM (SELECT 
       SKU, Product, --ROW_NUMBER() OVER (PARTITION BY product ORDER BY product) AS RowID, 
       DENSE_RANK() OVER (PARTITION BY sku,product ORDER BY id) as NewRow 
       FROM @TestData    
     ) AS dt 

私は午前結果は次のようになります。

SKU Product NewRow 
ABAD02 ENG 1 
ABAD02 SPA 1 
ABAD02 SPA 2 
ABAD03 SPA 1 
ABAD03 SPA 2 
ABAD03 SPA 3 
ABDE01 GRE 1 
ABDE01 RUS 1 
ABDE01 SPA 1 

私はここで逃したことをお伝えください。ありがとう!!

+0

私はあなたの答えに感謝し、あなたの時間を感謝したいと思います。最終的な注文は不要で、クエリは期待どおりに動作しています。 :) –

答えて

1

あなただけORDER BYPARTITION BYを望んでいない:

SELECT dt.SKU, dt.Product, 
     DENSE_RANK() OVER (ORDER BY min_id) as NewRow 
FROM (SELECT td.*, 
      MIN(td.id) OVER (PARTITION BY sku, product) as min_id 
     FROM @TestData td 
    ) td; 

あなただけのSKU /製品の組み合わせが異なる値を持つようにしたい場合は、サブクエリを必要としない:

SELECT dt.SKU, dt.Product, 
     DENSE_RANK() OVER (ORDER BY dt.SKU) as NewRow 
FROM @TestData td; 
0

次のサンプルデータがありますか?

insert into @TestData values (1 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (5 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (4 , 'ABAD02'  ,'ENG') 

上記の状況で、どのようにSPAとENGの間の並べ替えを決定するのですか?

商品分類定義リストがある場合は、たとえばNewRowを扱うほうがよいでしょう。

 declare @TestData table (ID int, sku char(6), product varchar(15)) 
    insert into @TestData values (1 , 'ABDE01'  ,'SPA') 
    insert into @TestData values (2 , 'ABDE01'  ,'GRE') 
    insert into @TestData values (3 , 'ABDE01'  ,'RUS') 
    insert into @TestData values (2 , 'ABAD03'  ,'SPA') 
    insert into @TestData values (4 , 'ABAD03'  ,'SPA') 
    insert into @TestData values (6 , 'ABAD03'  ,'SPA') 
    insert into @TestData values (1 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (2 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (4 , 'ABAD02'  ,'ENG') 

    SELECT *,DENSE_RANK() OVER (PARTITION BY sku ORDER BY x.sort) as NewRow 
    FROM @TestData AS t 
    -- definating the sort of product 
    INNER JOIN (VALUES(1,'SPA'),(2,'GRE'),(3,'ENG'),(4,'RUS')) x(sort,prd) ON x.prd=t.product 
    ORDER BY t.sku,t.ID 
 
ID   sku product   sort  prd NewRow 
----------- ------ --------------- ----------- ---- -------------------- 
1   ABAD02 SPA    1   SPA 1 
2   ABAD02 SPA    1   SPA 1 
4   ABAD02 ENG    3   ENG 2 
2   ABAD03 SPA    1   SPA 1 
4   ABAD03 SPA    1   SPA 1 
6   ABAD03 SPA    1   SPA 1 
1   ABDE01 SPA    1   SPA 1 
2   ABDE01 GRE    2   GRE 2 
3   ABDE01 RUS    4   RUS 3 
0

あなたは、ウィンドウ機能を使用して、予想される出力を得ることができる最も近いが、製品によってSKUと順序によって分割するです:

SELECT * 
, NewRow = DENSE_RANK()OVER(PARTITION BY sku ORDER BY product) 
FROM @TestData 
ORDER BY sku, ID 

しかし、あなたの予想される出力は、順を促進するように見えますIDはグループ化を分割せずにウィンドウ関数が処理するものではありません。カーソルループはおそらく、Expected Outputを正確に一致させる唯一の方法です。