如何根据多个条件 Sql 服务器增加 1 个序列号?

How can I make an incremented by 1 serial based on multiple conditions Sql server?

编辑 #1:代码可以包含随机字母和数字,例如“A123BC56xa”

编辑 #2:我试过这个 subquery 但它给了我 Syntax Error

SELECT DocDtls.Warehouse, Transactions.Code, DocDtls.zDate, Transactions.ID, Transactions.QtyIn, Transactions.QtyOut, Transactions.BalanceAfter, (SELECT Count("*") FROM Transactions AS B WHERE  B.[ID]<A.[ID] And B.[Warehouse] = A.[Warehouse] And B.[Code] = A.[Code])+1 AS Serial
FROM DocDtls INNER JOIN Transactions ON DocDtls.DocNum = Transactions.DocNum
ORDER BY DocDtls.Warehouse, Transactions.Code, DocDtls.zDate, Transactions.ID As A;

我有这个问题

SELECT DocDtls.Warehouse, DocDtls.zDate, Transactions.Code, Transactions.ID, Transactions.QtyIn, Transactions.QtyOut, Transactions.BalanceAfter
FROM DocDtls INNER JOIN Transactions ON DocDtls.DocNum = Transactions.DocNum
ORDER BY DocDtls.Warehouse, Transactions.Code, DocDtls.zDate, Transactions.ID;

这是当前的查询结果:

Warehouse | zDate   |   ID  |   Code    |   QtyIn   |QtyOut |   BalanceAfter
MainWh  |   20-03-2022  |   7   |   00001   |   5000|   0   |   0
MainWh  |   21-03-2022  |   8   |   00001   |   0   |   1000|   0
MainWh  |   20-03-2022  |   9   |   00002   |   7000|   0   |   0
MainWh  |   21-03-2022  |   10  |   00002   |   0   |   2500|   0
Wh1     |   21-03-2022  |   1   |   00001   |   1000|   0   |   0
Wh1     |   25-04-2022  |   5   |   00001   |   0   |   250 |   0
Wh1     |   25-04-2022  |   5   |   00001   |   0   |   300 |   0
Wh1     |   21-03-2022  |   2   |   00002   |   2500|   0   |   0
Wh1     |   25-04-2022  |   6   |   00002   |   0   |   500 |   0

我需要添加一个像 ID 这样的序列列,但基于 CodeWarehouse 增加 1,结果应该是 Like

Warehouse | zDate   |   ID  |   Code    |   QtyIn   |QtyOut |   BalanceAfter|   Serial
MainWh  |   20-03-2022  |   7   |   00001   |   5000|   0   |   0|               1  
MainWh  |   21-03-2022  |   8   |   00001   |   0   |   1000|    0|              2  
MainWh  |   20-03-2022  |   9   |   00002   |   7000|   0   |    0|              1  
MainWh  |   21-03-2022  |   10  |   00002   |   0   |   2500|   0|               2  
Wh1     |   21-03-2022  |   1   |   00001   |   1000|   0   |   0    |           1  
Wh1     |   25-04-2022  |   5   |   00001   |   0   |   250 |   0|               2  
Wh1     |   25-04-2022  |   5   |   00001   |   0   |   300 |   0|               3  
Wh1     |   21-03-2022  |   2   |   00002   |   2500|   0   |   0    |           1
Wh1     |   25-04-2022  |   6   |   00002   |   0   |   500 |   0|               2  

我正在使用 sqlserver 2014,在此先感谢。

如果代码列始终采用“00001”、“00002”、“00101”等格式,您可以使用强制转换。

SELECT DocDtls.Warehouse, DocDtls.zDate, Transactions.Code, Transactions.ID, Transactions.QtyIn, Transactions.QtyOut, Transactions.BalanceAfter
FROM DocDtls INNER JOIN Transactions ON DocDtls.DocNum = Transactions.DocNum
ORDER BY DocDtls.Warehouse, Transactions.Code, DocDtls.zDate, Transactions.ID, CAST(Transactions.Code AS INT) AS Serial;

SQL服务器2014太老了,急需更换

您可以使用 window 功能,例如 row_number 来实现您的目标

CREATE TABLE DocDtls 
    ([Warehouse] varchar(6), [zDate] varchar(10), [ID] int, [Code] int, [QtyIn] int, [QtyOut] int, [BalanceAfter] int)
;
    
INSERT INTO DocDtls 
    ([Warehouse], [zDate], [ID], [Code], [QtyIn], [QtyOut], [BalanceAfter])
VALUES
    ('MainWh', '20-03-2022', 7, 00001, 5000, 0, 0),
    ('MainWh', '21-03-2022', 8, 00001, 0, 1000, 0),
    ('MainWh', '20-03-2022', 9, 00002, 7000, 0, 0),
    ('MainWh', '21-03-2022', 10, 00002, 0, 2500, 0),
    ('Wh1', '21-03-2022', 1, 00001, 1000, 0, 0),
    ('Wh1', '25-04-2022', 5, 00001, 0, 250, 0),
    ('Wh1', '25-04-2022', 5, 00001, 0, 300, 0),
    ('Wh1', '21-03-2022', 2, 00002, 2500, 0, 0),
    ('Wh1', '25-04-2022', 6, 00002, 0, 500, 0)
;
GO

9 行受影响

SELECT *,
ROW_NUMBER() OVER( PARTITION BY [Warehouse],[Code] ORDER BY [ID]) as Serial
FROM DocDtls
GO
Warehouse | zDate      | ID | Code | QtyIn | QtyOut | BalanceAfter | Serial
:-------- | :--------- | -: | ---: | ----: | -----: | -----------: | -----:
MainWh    | 20-03-2022 |  7 |    1 |  5000 |      0 |            0 |      1
MainWh    | 21-03-2022 |  8 |    1 |     0 |   1000 |            0 |      2
MainWh    | 20-03-2022 |  9 |    2 |  7000 |      0 |            0 |      1
MainWh    | 21-03-2022 | 10 |    2 |     0 |   2500 |            0 |      2
Wh1       | 21-03-2022 |  1 |    1 |  1000 |      0 |            0 |      1
Wh1       | 25-04-2022 |  5 |    1 |     0 |    250 |            0 |      2
Wh1       | 25-04-2022 |  5 |    1 |     0 |    300 |            0 |      3
Wh1       | 21-03-2022 |  2 |    2 |  2500 |      0 |            0 |      1
Wh1       | 25-04-2022 |  6 |    2 |     0 |    500 |            0 |      2

db<>fiddle here