Sql 根据现有数据为新条目生成编号系列

Sql 根据现有数据为新条目生成编号系列,sql,tsql,Sql,Tsql,我有这样的现有数据 +-------+-----+----------+ | House | Pet | ItemCode | +-------+-----+----------+ | A | Cat | ACat001 | | A | Dog | ADog001 | | B | Cat | BCat001 | | A | Dog | ADog002 | +-------+-----+----------+ 我想通过T-SQL为新条目生成新的项目代码,如

我有这样的现有数据

+-------+-----+----------+
| House | Pet | ItemCode |
+-------+-----+----------+
| A     | Cat | ACat001  |
| A     | Dog | ADog001  |
| B     | Cat | BCat001  |
| A     | Dog | ADog002  |
+-------+-----+----------+
我想通过T-SQL为新条目生成新的项目代码,如

+-------+-----+----------+--------------------------------+
| House | Pet | ItemCode | ItemCodes supposed to generate |
+-------+-----+----------+--------------------------------+
| A     | Cat | ????     | ACat002                        |
| C     | Dog | ????     | CDog001                        |
+-------+-----+----------+--------------------------------+

请帮助。

我建议保留另一列作为
索引
,以便在
房屋
中分解项目代码,
Pet
Index
并从中创建
itemcode
,并且在表中有一个标识列作为主键,这将使解决方案更简单,性能更好

考虑到该表的现状,您可以首先获得房子中每个宠物的最大索引,然后使用它来计算下一个索引,并为新插入的数据更新
itemcode

表格脚本和插入内容

CREATE TABLE HousePet
    ([House] varchar(1), [Pet] varchar(3), [ItemCode] varchar(7));

INSERT INTO HousePet
    ([House], [Pet], [ItemCode])
VALUES
    ('A', 'Cat', 'ACat001'),
    ('A', 'Dog', 'ADog001'),
    ('B', 'Cat', 'BCat001'),
    ('A', 'Dog', 'ADog002');

-- new rows inserted for which `ItemCode` is required
INSERT INTO HousePet
    ([House], [Pet], [ItemCode])
    VALUES
    ('A', 'Cat', NULL),
    ('C', 'Dog', NULL);
更新SQL

;WITH HousePetIndex AS
(
    SELECT House,Pet,MAX(CONVERT(INT,REPLACE(ItemCode,House + Pet,''))) as MaxIndex
    FROM HousePet
    WHERE ItemCode IS NOT NULL
    GROUP BY House,Pet
), HousePetInserted as 
(
    SELECT HP.House,HP.Pet,HP.ItemCode,ROW_NUMBER()OVER(PARTITION BY HP.House,HP.Pet ORDER BY HP.House) as ItemIndex
    FROM HousePet HP
    WHERE ItemCode IS NULL
)
UPDATE HP1
SET ItemCode = HP1.House + HP1.Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex + ISNULL(HP2.MaxIndex,0)),3)
FROM HousePetInserted HP1
LEFT JOIN HousePetIndex HP2
    ON HP1.House = HP2.House AND HP1.Pet = HP2.Pet

SELECT * FROM HousePet
逻辑

  • houseptindex
    CTE中获取每家每户和宠物现有数据的最大索引
  • 如果插入了同一宠物和房屋的多行,则根据
    行数
    用一些索引标识新行
  • 根据从max Index和Index或新行派生的
    House
    Pet
    Index
    更新新行的
    itemcode
输出

House   Pet ItemCode
A   Cat ACat001
A   Dog ADog001
B   Cat BCat001
A   Dog ADog002
A   Cat ACat002
C   Dog CDog001

编辑

House   Pet ItemCode
A   Cat ACat001
A   Dog ADog001
B   Cat BCat001
A   Dog ADog002
A   Cat ACat002
C   Dog CDog001
如果您决定添加一个
itemindex
和一个标识列
ID
,则可以将
ItemCode
作为计算列

CREATE TABLE HousePet
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    [House] varchar(1),
    [Pet] varchar(3),
    [ItemIndex] INT,
    [ItemCode] AS (House + Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex),3))
);
你可以这样做

UPDATE T
SET ItemIndex = rn + MaxIndex
FROM
(
    SELECT ID,House,Pet,ItemIndex,ROW_NUMBER()OVER(PARTITION BY House,Pet ORDER BY ID ASC) rn
    FROM HousePet
    WHERE ItemIndex IS NULL
)T
INNER JOIN 
(
    SELECT House,Pet,ISNULL(MAX(ItemIndex),0) as MaxIndex
    FROM HousePet
    GROUP BY House,Pet
) MaxIndexTable
ON MaxIndexTable.House = T.House AND MaxIndexTable.Pet = T.Pet

这个结果的逻辑是什么?谁投票支持这个问题,至少你能告诉我们这个输出的预期逻辑要求!!用户希望构建一个逻辑,为基于house和pet的新插入数据生成新的项目代码。因此,新插入的a屋猫将具有ACat002项目代码,因为a屋猫已经存在。对不起,伙计们。是的,逻辑就像@ughai说的那样。谢谢,多亏了这个解决方案。因此,新表应该是4列House、Pet、Index和ItemCode(PrimaryKey),对吗?您的主键应该是一个单独的
ID
列,最好是
IDENTITY
列。如果您确实要创建这样一个表,那么您的
ItemCode
列就可以是一个基于
House
Pet
Index
的计算列,在这种情况下,您只需
更新
索引即可。我明白了。非常感谢。