Sql 生成唯一的公司编号+;全年
我有一个包含列的表:Sql 生成唯一的公司编号+;全年,sql,sql-server,Sql,Sql Server,我有一个包含列的表:PurchaseOrderID、CompanyID和CreatedDate。我希望在此表中有一个名为PONo的列,该列将自动具有上一列中的值,如:PO/2016(从CreatedDate开始的年份))/001(值将在同一年和同一公司id中递增) 我期望的表格如下: PurchaseOrderID CompanyID PONo CreatedDate 1 1 PO/2016/001
PurchaseOrderID
、CompanyID
和CreatedDate
。我希望在此表中有一个名为PONo
的列,该列将自动具有上一列中的值,如:PO/2016(从CreatedDate开始的年份)
)/001(值将在同一年和同一公司id中递增)
我期望的表格如下:
PurchaseOrderID CompanyID PONo CreatedDate
1 1 PO/2016/001 2016-01-31
2 1 PO/2016/002 2016-02-22
3 1 PO/2016/003 2016-05-25
4 2 PO/2016/001 2016-09-1
5 2 PO/2016/002 2016-10-11
6 2 PO/2016/003 2016-12-31
7 1 PO/2017/001 2017-01-31
8 1 PO/2017/002 2017-02-2
9 1 PO/2017/003 2017-05-20
10 2 PO/2017/001 2017-06-25
11 2 PO/2017/002 2017-07-15
12 2 PO/2017/003 2017-08-22
PurchaseOrderID公司ID PONo CreatedDate
1 1 PO/2016/001 2016-01-31
2 1 PO/2016/002 2016-02-22
3 1 PO/2016/003 2016-05-25
4.2 PO/2016/001 2016-09-1
5.2 PO/2016/002 2016-10-11
6.2 PO/2016/003 2016-12-31
7.1 PO/2017/001 2017-01-31
8 1 PO/2017/002 2017-02-2
9 1 PO/2017/003 2017-05-20
10 2 PO/2017/001 2017-06-25
11.2 PO/2017/002 2017-07-15
12.2 PO/2017/003 2017-08-22
从这个表中,我想生成和更新类似于上表的PONo。
我希望查询生成PONo
当我在表中插入新记录时,PONo会根据该记录自动生成
注意:如果需要添加任何列,请告诉我。您可以查找此列
WITH CTE AS(
SELECT PurchaseOrderID,
CompanyID,
CreatedDate,
ROW_NUMBER() OVER (PARTITION BY CompanyID,YEAR(CreatedDate) ORDER BY CreatedDate) AS RN
FROM TableName
)
SELECT PurchaseOrderID,
CompanyID,
'PO/'+CAST(YEAR(CreatedDate) AS VARCHAR(5))+'/'+RIGHT('00'+CAST(RN AS VRACHAR(5),3)),
CreatedDate
FROM CTE
试试这个
IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL
DROP TABLE #TestData;
CREATE TABLE #TestData (
PurchaseOrderID int NOT NULL PRIMARY KEY,
CompanyID int NOT NULL,
PONo CHAR(11) NULL,
CreatedDate DATE NOT NULL
);
INSERT #TestData(PurchaseOrderID, CompanyID, CreatedDate) VALUES
(1 , 1, '2016-01-31'),
(2 , 1, '2016-02-22'),
(3 , 1, '2016-05-25'),
(4 , 2, '2016-09-01'),
(5 , 2, '2016-10-11'),
(6 , 2, '2016-12-31'),
(7 , 1, '2017-01-31'),
(8 , 1, '2017-02-02'),
(9 , 1, '2017-05-20'),
(10, 2, '2017-06-25'),
(11, 2, '2017-07-15'),
(12, 2, '2017-08-22');
-- SELECT * FROM #TestData td;
--=========================================
SELECT
*,
PONo = CONCAT('PO/', YEAR(td.CreatedDate), '/', RIGHT(CONCAT('000',
ROW_NUMBER() OVER (PARTITION BY td.CompanyID, YEAR(td.CreatedDate) ORDER BY td.PurchaseOrderID)), 3))
FROM
#TestData td;
结果
PurchaseOrderID CompanyID PONo CreatedDate PONo
--------------- ----------- ----------- ----------- -------------------
1 1 NULL 2016-01-31 PO/2016/001
2 1 NULL 2016-02-22 PO/2016/002
3 1 NULL 2016-05-25 PO/2016/003
7 1 NULL 2017-01-31 PO/2017/001
8 1 NULL 2017-02-02 PO/2017/002
9 1 NULL 2017-05-20 PO/2017/003
4 2 NULL 2016-09-01 PO/2016/001
5 2 NULL 2016-10-11 PO/2016/002
6 2 NULL 2016-12-31 PO/2016/003
10 2 NULL 2017-06-25 PO/2017/001
11 2 NULL 2017-07-15 PO/2017/002
12 2 NULL 2017-08-22 PO/2017/003
如果要生成新的序列逻辑
CREATE TABLE PO_wise_seq
(
PO BIGINT,
year_ INT,
seq BIGINT IDENTITY(1,1)
)
DECLARE @PO_ID BIGINT =332
DECLARE @Year_id BIGINT =2016
INSERT INTO PO_wise_seq VALUES (@PO_ID,@Year_id)
select PO,
cast(@PO_ID as nvarchar) +'/' +cast(@Year_id as nvarchar)+'/'+cast(count(1) as nvarchar) as seq
FROM PO_wise_seq
WHERE PO=@PO_ID
AND year_=@Year_id
GROUP BY PO,year_
CREATE TABLE PO_wise_seq
(
CompanyID BIGINT,
year_ INT,
seq BIGINT IDENTITY(1,1)
)
DECLARE @CompanyID BIGINT =332
DECLARE @Year_id BIGINT =2016
INSERT INTO PO_wise_seq VALUES (@CompanyID,@Year_id)
select CompanyID
,cast(@CompanyID as nvarchar) +'/' +cast(@Year_id as nvarchar)+'/'+cast(count(1) as nvarchar) as seq
FROM PO_wise_seq
WHERE CompanyID=@CompanyID
AND year_=@Year_id
GROUP BY CompanyID,year_
如果要生成新的序列逻辑
CREATE TABLE PO_wise_seq
(
PO BIGINT,
year_ INT,
seq BIGINT IDENTITY(1,1)
)
DECLARE @PO_ID BIGINT =332
DECLARE @Year_id BIGINT =2016
INSERT INTO PO_wise_seq VALUES (@PO_ID,@Year_id)
select PO,
cast(@PO_ID as nvarchar) +'/' +cast(@Year_id as nvarchar)+'/'+cast(count(1) as nvarchar) as seq
FROM PO_wise_seq
WHERE PO=@PO_ID
AND year_=@Year_id
GROUP BY PO,year_
CREATE TABLE PO_wise_seq
(
CompanyID BIGINT,
year_ INT,
seq BIGINT IDENTITY(1,1)
)
DECLARE @CompanyID BIGINT =332
DECLARE @Year_id BIGINT =2016
INSERT INTO PO_wise_seq VALUES (@CompanyID,@Year_id)
select CompanyID
,cast(@CompanyID as nvarchar) +'/' +cast(@Year_id as nvarchar)+'/'+cast(count(1) as nvarchar) as seq
FROM PO_wise_seq
WHERE CompanyID=@CompanyID
AND year_=@Year_id
GROUP BY CompanyID,year_
问题还不清楚。这是预期的结果吗?是否需要生成PONo的查询?不理解“生成并更新PONo-like表”?是。我想知道如何使用查询生成PONo。是否要通过连接列来生成“PONo”?您可以使用
CONCAT
和行数
轻松生成PONo
的值。我建议您不要将这些值永久存储在表列中,因为如果在表中添加新记录,这将导致维护列值的巨大开销。