如何根据多个条件 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 这样的序列列,但基于 Code
和 Warehouse
增加 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
编辑 #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 这样的序列列,但基于 Code
和 Warehouse
增加 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