#sql-server #tsql #sql-update
#sql-сервер #tsql #sql-обновление
Вопрос:
(Я пытаюсь сделать это в хранимой процедуре SQL Server)
У меня есть временная таблица с вертикальной структурой, и мне нужно вычислить значение из полей, которые находятся в разных строках
DECLARE @tempTable TABLE(
nodeId INT IDENTITY(1,1),
parentNodeId INT,
fieldName NVARCHAR(255),
fieldValue decimal(7,2)
);
Вот несколько примеров данных:
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(0,'deliveryLines',null)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'unitPrice',12)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'taxRate',0.5)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'unitTax',0)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'unitPrice',25)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'taxRate',0.1)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'unitTax',0)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'unitPrice',333)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'taxRate',0.17)
INSERT INTO @tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'unitTax',0)
итак, таблица выглядит следующим образом:
nodeId parentNodeId fieldName fieldValue
1 0 deliveryLines NULL
2 1 deliveryLine NULL
3 2 unitPrice 12.00
4 2 taxRate 0.50
5 2 unitTax 0.00
6 1 deliveryLine NULL
7 6 unitPrice 25.00
8 6 taxRate 0.10
9 6 unitTax 0.00
10 1 deliveryLine NULL
11 10 unitPrice 333.00
12 10 taxRate 0.17
13 10 unitTax 0.00
и unitTax должен быть UnitPrice * TaxRate (из предыдущих 2 строк с тем же parentNodeId).
итак, для parentNodeId = 2 (например) данные должны выглядеть следующим образом:
3 2 unitPrice 12.00
4 2 taxRate 0.50
5 2 unitTax 6.00
Мне нужно установить значение unitTax с помощью ОБНОВЛЕНИЯ, но я не могу понять, как это сделать.
Данные были сгенерированы из xml-документа, и у меня нет никакого контроля над структурой. Кто-нибудь может мне помочь?
Комментарии:
1. Итак, каких именно результатов вы ожидаете здесь? Что вы уже пробовали для достижения своей цели?
2. У вас тоже есть XML-документ, возможно, оттуда будет проще… Но, честно говоря, я действительно не понимаю, чего вы пытаетесь достичь. Пожалуйста, добавьте ожидаемый результат.
Ответ №1:
Привет, я думаю, что на этот запрос можно ответить :
CREATE TABLE #tempTable(
nodeId INT IDENTITY(1,1),
parentNodeId INT,
fieldName NVARCHAR(255),
fieldValue decimal(7,2)
);
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(0,'deliveryLines',null)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'unitPrice',12)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'taxRate',0.5)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(2,'unitTax',0)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'unitPrice',25)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'taxRate',0.1)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(6,'unitTax',0)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(1,'deliveryLine',null)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'unitPrice',333)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'taxRate',0.17)
INSERT INTO #tempTable(parentNodeId,fieldName,fieldValue) VALUES(10,'unitTax',0)
SELECT * FROM #tempTable;
SELECT parentNodeId,
MAX(CASE WHEN fieldName = 'unitPrice' THEN fieldValue ELSE NULL END) AS 'unitPrice',
MAX(CASE WHEN fieldName = 'taxRate' THEN fieldValue ELSE NULL END) AS 'taxRate'
FROM #tempTable GROUP BY parentNodeId;
UPDATE T SET fieldValue = TT.unitPrice * TT.taxRate
FROM #tempTable T
JOIN (SELECT parentNodeId,
MAX(CASE WHEN fieldName = 'unitPrice' THEN fieldValue ELSE NULL END) AS 'unitPrice',
MAX(CASE WHEN fieldName = 'taxRate' THEN fieldValue ELSE NULL END) AS 'taxRate'
FROM #tempTable GROUP BY parentNodeId) TT ON T.parentNodeId = TT.parentNodeId AND T.fieldName = 'unitTax'
SELECT * FROM #tempTable;
DROP TABLE #tempTable;
Я знаю другую альтернативу, я думаю, сводный запрос при обновлении тоже может сработать.