SQL Объединяет значения в вертикальной таблице с использованием хранимой процедуры

#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;
  

Я знаю другую альтернативу, я думаю, сводный запрос при обновлении тоже может сработать.

https://learn.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017