更改重复行的值

时间:2015-09-08 05:22:07

标签: sql-server

我需要有关如何为同一采购订单编码重复行ID的帮助,并为其他行ID分配新编号。我想将Line ID + 100用于其他重复行。例如,如果采购订单#11有三个线路ID#5s,则第一个将保持为5,第二个将保持为501,第三个将为502,但是,我只能获得1,2或3或者如果没有重复我不知道用什么来增加。我希望有人可以协助或指导。谢谢

PurchaseOrderID   LineID   PackingList  NewLineID  
11                1        12323        1  
11                1        78786        2    
11                2        67523        1    
11                3        44559        1    
11                4        44559        1    
11                5        96545        1    
11                5        12323        2    
11                5        34569        3   

装箱单会导致重复的行ID相同。

以下是我正在尝试使用的内容,它为我提供了上述NewLineID:

SELECT 
  PurchaseOrderID, 
  LineID, 
  PackingList, 
  ROW_NUMBER() over
  (
      partition by PurchaseOrderID, LineID
      order by PurchaseOrderID, LineID
  ) as NewLineID 
FROM PurchaseOrderTransactions

1 个答案:

答案 0 :(得分:2)

使用ROW_NUMBERCASE

WITH Cte AS(
    SELECT 
        PurchaseOrderID, 
        LineID, 
        PackingList, 
        RN = ROW_NUMBER() OVER (PARTITION BY PurchaseOrderID, LineID ORDER BY LineID)
    FROM PurchaseOrderTransactions
)
SELECT
    PurchaseOrderID, 
    LineID, 
    PackingList, 
    NewLineID = CASE 
                    WHEN RN = 1 THEN LineID
                    ELSE (LineID * 100) + (RN - 1)
                END
FROM Cte

不使用CTE:

SELECT 
    PurchaseOrderID, 
    LineID, 
    PackingList, 
    NewLineID = 
        CASE
            WHEN ROW_NUMBER() OVER (PARTITION BY PurchaseOrderID, LineID ORDER BY LineID) = 1 THEN LineID
            ELSE (LineID * 100) + (ROW_NUMBER() OVER (PARTITION BY PurchaseOrderID, LineID ORDER BY LineID) - 1)
        END
FROM PurchaseOrderTransactions

SQL Fiddle

| PurchaseOrderID | LineID | PackingList | NewLineID |
|-----------------|--------|-------------|-----------|
|              11 |      1 |       12323 |         1 |
|              11 |      1 |       78786 |       101 |
|              11 |      2 |       67523 |         2 |
|              11 |      3 |       44559 |         3 |
|              11 |      4 |       44559 |         4 |
|              11 |      5 |       96545 |         5 |
|              11 |      5 |       12323 |       501 |
|              11 |      5 |       34569 |       502 |