Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 生成唯一的公司编号+;全年_Sql_Sql Server - Fatal编程技术网

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
的值。我建议您不要将这些值永久存储在表列中,因为如果在表中添加新记录,这将导致维护列值的巨大开销。