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
逻辑
- 在
CTE中获取每家每户和宠物现有数据的最大索引houseptindex
- 如果插入了同一宠物和房屋的多行,则根据
用一些索引标识新行行数
- 根据从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
的计算列,在这种情况下,您只需更新索引即可。我明白了。非常感谢。