2017-04-03 8 views
3

私はSQL質問をしたいと思います(私は現在SQL Server Management Studioを使用しています)。SQL Server:レコードの他のフィールドに応じて参照番号を追加してください

CustomerID  ProductID   ProductName 
------------------------------------------------------ 
111     6577    ProductA 
111     6123    ProductB  
111     1133    ProductC 
111     1133    ProductC  
222     6577    ProductA  
222     6577    ProductA  
222     1578    ProductL  
333     9273    ProductX 

及び結果のため、それは他の列の参照番号を追加するためにはcustomerId及びプロダクトIDに依存するであろう。(同じ顧客IDの製品IDは、参照番号がインクリメントする異なる場合)

CustomerID  ProductID   ProductName  ref 
----------------------------------------------------------- 
111     6577    ProductA   111-1 
111     6123    ProductB   111-2 
111     1133    ProductC   111-3 
111     1133    ProductC   111-3 
222     6577    ProductA   222-1 
222     6577    ProductA   222-1 
222     1578    ProductL   222-2 
333     9273    ProductX   333-1 

productidを比較して参照番号を追加する方法がわかりません。

dense_rank()使用して、事前

答えて

2

にありがとう:

select * 
    , ref = convert(varchar(13),customerid) + '-' 
     + convert(varchar(13),dense_rank() over (partition by customerid order by productname)) 
from t 

rextesterデモ:http://rextester.com/UBXR81287

リターン:

+------------+-----------+-------------+-------+ 
| customerid | productid | productname | ref | 
+------------+-----------+-------------+-------+ 
|  111 |  6577 | ProductA | 111-1 | 
|  111 |  6123 | ProductB | 111-2 | 
|  111 |  1133 | ProductC | 111-3 | 
|  111 |  1133 | ProductC | 111-3 | 
|  222 |  6577 | ProductA | 222-1 | 
|  222 |  6577 | ProductA | 222-1 | 
|  222 |  1578 | ProductL | 222-2 | 
|  333 |  9273 | ProductX | 333-1 | 
+------------+-----------+-------------+-------+ 
3

をこの

をお試しください
DECLARE @sampledata AS TABLE 
(
CustomerID int,  
ProductID int 
) 

INSERT INTO @sampledata VALUES (111, 6577),(111,6123 ),(111,1133),(111 ,1133) 

SELECT *, 
     CONCAT(s.CustomerID,'-',CAST(dense_rank() over(PARTITION BY s.CustomerID ORDER BY s.ProductID DESC) AS varchar(10))) AS ref 
FROM @sampledata s 
+0

dense_rankが正しい。私はちょうど編集しました – TriV

1

あなたはDENSE_RANK()関数

select *, concat(customerId, '-', dense_rank() over(partition by Customerid order by ProductName)) from #yourCustomer 

あなたのテーブルを使用することができます

create table #yourCustomer (CustomerId int, ProductId int, ProductName varchar(20)) 

insert into #yourCustomer (CustomerId, ProductId, ProductName) values 
(111  ,  6577  ,'ProductA') 
,(111  ,  6123  ,'ProductB')  
,(111  ,  1133  ,'ProductC') 
,(111  ,  1133  ,'ProductC')  
,(222  ,  6577  ,'ProductA')  
,(222  ,  6577  ,'ProductA')  
,(222  ,  1578  ,'ProductL')  
,(333  ,  9273  ,'ProductX') 
1

を密ランクの答えは、すべての非常に優れているとあなたが求めてきました正確に何を提供しています。

しかし、潜在的なバナナスキンがあります。将来、新しい製品を導入してからRefロジックを再実行すると、異なる結果が得られます。

Refの形式が問題にならない場合は、CustomerIdProductIdを連結することを検討してください。例:111-1は111-6577になります。 222-2は222-1578になる。

フォーマットが重要な場合は、Productテーブル(ProductIdProductNameProductRef)の作成を検討してください。 Refは、CustomerId + - + ProductRefと等しくなります。例:

ProductId ProductName  ProductRef 
6577  ProductA  1 
6123  ProductB  2 
1133  ProductC  3 
関連する問題