SQL Server 2012 中的存储过程
Stored procedure in SQL Server 2012
我需要你的帮助来编写存储过程以将下面给出的数据更新到 SQL 服务器中的 table。
我上传了一张图片以确保格式设置正确。
标识零件号的第二列,例如:part 100
在材料清单中有 103
和 104
作为其组成部分。但是只有 1(103 分配给 id 1
、part 100
或 104
分配给 id 2
、part 100
)。
为了我们在顶级组件的计划物料清单中进行区分,我们需要使用所用组件的最后一个字符更新组件散列键(字符串)(例如:103
,使用 3
), 000111
变为 300111
。将哪个组件分配给父组件并不重要。
谁能帮我解决这个问题。谢谢。
Data Structure Expected result
ID Part hashkey ID Part hashkey
----------------- --------------------
1 100 000111 1 100 300111
2 100 000111 2 100 400111
3 103 000111 3 103 000111
4 104 000111 4 104 000111
数据结构:
expected_result
试试这个。
DECLARE @data TABLE (ID INT, Part INT, hashkey VARCHAR(100))
INSERT INTO @data
SELECT 1, 100, '000111'
UNION ALL
SELECT 2, 100, '000111'
UNION ALL
SELECT 3, 101, '000111'
UNION ALL
SELECT 4, 102, '000111';
WITH cte
AS (
SELECT ID, Part, hashkey, ROW_number() OVER (
PARTITION BY part ORDER BY part ASC
) AS RN
FROM @data
)
SELECT ID, Part, CASE
WHEN RN > 1
THEN cast(ID AS VARCHAR) + hashkey
WHEN lead(RN, 1) OVER (
ORDER BY part, RN
) > 1
THEN cast(ID AS VARCHAR) + hashkey
ELSE hashkey
END AS hashkey
FROM cte
好的,如果我现在理解你的要求,那么应该这样做:
WITH cteParent AS (
SELECT Id, hashkey,
ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
FROM MyTable
WHERE Part=100
)
, cteComponent AS (
SELECT Id, hashkey,
ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
FROM MyTable
WHERE Part<>100
)
SELECT t.Id, t.Part
, CASE
WHEN t.Part=100 THEN RIGHT(CAST(c.Part AS varchar(31)),1) + SUBSTRING(CAST(p.hashkey AS varchar(31)), 2, LEN(CAST(t.hashkey AS varchar(31)))-1)
ELSE CAST(t.hashkey AS varchar(31))
END AS hashkey
FROM MyTable t
LEFT OUTER JOIN cteParent p ON t.Id=p.Id
LEFT OUTER JOIN cteComponent c
ON p.hashkey=c.hashkey
AND p.rn=c.rn
ORDER BY ID asc
我需要你的帮助来编写存储过程以将下面给出的数据更新到 SQL 服务器中的 table。
我上传了一张图片以确保格式设置正确。
标识零件号的第二列,例如:part 100
在材料清单中有 103
和 104
作为其组成部分。但是只有 1(103 分配给 id 1
、part 100
或 104
分配给 id 2
、part 100
)。
为了我们在顶级组件的计划物料清单中进行区分,我们需要使用所用组件的最后一个字符更新组件散列键(字符串)(例如:103
,使用 3
), 000111
变为 300111
。将哪个组件分配给父组件并不重要。
谁能帮我解决这个问题。谢谢。
Data Structure Expected result
ID Part hashkey ID Part hashkey
----------------- --------------------
1 100 000111 1 100 300111
2 100 000111 2 100 400111
3 103 000111 3 103 000111
4 104 000111 4 104 000111
数据结构: expected_result
试试这个。
DECLARE @data TABLE (ID INT, Part INT, hashkey VARCHAR(100))
INSERT INTO @data
SELECT 1, 100, '000111'
UNION ALL
SELECT 2, 100, '000111'
UNION ALL
SELECT 3, 101, '000111'
UNION ALL
SELECT 4, 102, '000111';
WITH cte
AS (
SELECT ID, Part, hashkey, ROW_number() OVER (
PARTITION BY part ORDER BY part ASC
) AS RN
FROM @data
)
SELECT ID, Part, CASE
WHEN RN > 1
THEN cast(ID AS VARCHAR) + hashkey
WHEN lead(RN, 1) OVER (
ORDER BY part, RN
) > 1
THEN cast(ID AS VARCHAR) + hashkey
ELSE hashkey
END AS hashkey
FROM cte
好的,如果我现在理解你的要求,那么应该这样做:
WITH cteParent AS (
SELECT Id, hashkey,
ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
FROM MyTable
WHERE Part=100
)
, cteComponent AS (
SELECT Id, hashkey,
ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
FROM MyTable
WHERE Part<>100
)
SELECT t.Id, t.Part
, CASE
WHEN t.Part=100 THEN RIGHT(CAST(c.Part AS varchar(31)),1) + SUBSTRING(CAST(p.hashkey AS varchar(31)), 2, LEN(CAST(t.hashkey AS varchar(31)))-1)
ELSE CAST(t.hashkey AS varchar(31))
END AS hashkey
FROM MyTable t
LEFT OUTER JOIN cteParent p ON t.Id=p.Id
LEFT OUTER JOIN cteComponent c
ON p.hashkey=c.hashkey
AND p.rn=c.rn
ORDER BY ID asc