Проблема с серийным номером в SQL Server 2008 - PullRequest
1 голос
/ 15 января 2010

У меня есть таблица заказов и деталей заказа, как показано ниже:

Детали_Заказы

Order_ID   int 
Order_Code varchar(10)
Product Name   varchar(50)
Qty     Int
SeqNO   varchar(10)

Ниже приведены образцы записей

10001    OC   Ottoman   10  Null
10002    OC   Ottoman   3   Null  
10003    OC   Ottoman   2   Null
10004    OC   Ottoman   2   Null

Есть ли в любом случае, я могу обновить столбец SeqNo с 1, 1A, 1B, 1C, если Order_Code такой же, иначе он должен увеличиваться на один.

например

10001    OC   Ottoman   10  Null
10002    OD   Ottoman   3   Null  
10003    OE   Ottoman   2   Null
10004    OF   Ottoman   2   Null

это должно быть 1,2,3,4

Пожалуйста, помогите

1 Ответ

0 голосов
/ 15 января 2010

Не уверен, что я все понимаю, но взгляните на этот пример:

DECLARE @OrderDetails TABLE
  ( 
   Order_ID int
  ,Order_Code varchar(10)
  ,Product_Name varchar(15)
  ,Qty int
  )

INSERT  INTO @OrderDetails
        ( Order_ID, Order_Code, Product_Name, Qty)
VALUES  ( 10001, 'OC', 'Ottoman', 10 )
,       ( 10002, 'OC', 'Ottoman', 3 )
,       ( 10003, 'OC', 'Ottoman', 2 )
,       ( 10004, 'OC', 'Ottoman', 2 )
,       ( 10005, 'SF', 'Sofa', 2 )
,       ( 10006, 'SF', 'Sofa', 7 )

;
WITH  abcd
        AS ( SELECT Order_ID
                   ,Order_Code
                   ,Product_Name
                   ,Qty
                   ,DENSE_RANK() OVER ( ORDER BY Order_Code ) AS [RnkSeq]
                   ,ROW_NUMBER() OVER ( PARTITION BY Order_Code ORDER BY Order_ID ) AS [NumSeq]
             FROM   @OrderDetails
           )
  SELECT  Order_ID
         ,Order_Code
         ,Product_Name
         ,Qty
         ,CAST(RnkSeq AS varchar(10)) + CHAR(64 + NumSeq) AS SeqNo
  FROM    abcd

Возвращает

Order_ID    Order_Code Product_Name    Qty         SeqNo
----------- ---------- --------------- ----------- -----------
10001       OC         Ottoman         10          1A
10002       OC         Ottoman         3           1B
10003       OC         Ottoman         2           1C
10004       OC         Ottoman         2           1D
10005       SF         Sofa            2           2A
10006       SF         Sofa            7           2B

Надеюсь, это поможет.

UPDATE

Для обновления и 1, 1A, 1B.. используйте:

;
WITH  abcd
        AS ( SELECT Order_ID
                   ,Order_Code
                   ,Product_Name
                   ,Qty
                   ,DENSE_RANK() OVER ( ORDER BY Order_Code ) AS [RnkSeq]
                   ,ROW_NUMBER() OVER ( PARTITION BY Order_Code ORDER BY Order_ID ) AS [NumSeq]
             FROM   @OrderDetails
           ),
      efgh
        AS ( SELECT Order_ID
                   ,Order_Code
                   ,Product_Name
                   ,Qty
                   ,CAST(RnkSeq AS varchar(10)) + CHAR(63 + NumSeq) AS [Seq]
             FROM   abcd
           )
  UPDATE  @OrderDetails
  SET     SeqNo = REPLACE(e.Seq,'@','')
  FROM    @OrderDetails AS o
          JOIN efgh AS e ON e.Order_ID = o.Order_ID

Остерегайтесь того, что происходит, когда вы получаете больше, чем 1, 1A, ... 1Z различных номеров заказов для османов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...