Суммируйте значение нескольких узлов на основе определенного условия в XML в SQL Server 2014

Ниже приведен XML, и я хочу суммировать значение «ClaimPayment.Amount», где «ClaimPayment.TypeCode» — это компенсация. Значит, на выходе будет 10000. Помните, что узлов может быть больше.

    <ZObject>   
      <Attribute Name = "ClaimPayment">
        <ZObject>
          <Attribute Name = "Re4eba255bf394bdbaccba77b6edca4f5">
            <ZObject>
              <Attribute Name = "ClaimPayment.TypeCode">
                <ZObject>
                  <Value xsi:typeName = "xs:string">Expense</Value>
                </ZObject>
              </Attribute>
              <Attribute Name = "ClaimPayment.Amount">
                <ZObject>
                  <Value xsi:typeName = "xs:decimal">3000.0000</Value>
                </ZObject>
              </Attribute>
            </ZObject>
          </Attribute>
          <Attribute Name = "R0ffc51fa96594b7989a7dec13a4ddd15">
            <ZObject>
              <Attribute Name = "ClaimPayment.TypeCode">
                <ZObject>
                  <Value xsi:typeName = "xs:string">Indemnity</Value>
                </ZObject>
              </Attribute>
              <Attribute Name = "ClaimPayment.Amount">
                <ZObject>
                  <Value xsi:typeName = "xs:decimal">50000.0000</Value>
                </ZObject>
              </Attribute>
            </ZObject>
          </Attribute>
          <Attribute Name = "R64b104f17aa94ffebb75ad0b2d8b2775">
            <ZObject>
              <Attribute Name = "ClaimPayment.TypeCode">
                <ZObject>
                  <Value xsi:typeName = "xs:string">Indemnity</Value>
                </ZObject>
              </Attribute>
              <Attribute Name = "ClaimPayment.Amount">
                <ZObject>
                  <Value xsi:typeName = "xs:decimal">50000.0000</Value>
                </ZObject>
              </Attribute>
            </ZObject>
          </Attribute>
        </ZObject>   
    </Attribute> 
</ZObject>

Я погуглил и дошел до этого:

create table #claims(id int identity(1,1) , customdata xml)
;WITH XMLNAMESPACES (
Default 'http://www.oceanwide.com/ZObject/2014',
'http://www.w3.org/2001/XMLSchema' as xs,
'http://www.w3.org/2001/XMLSchema-instance' as xsi)
insert into #claims(customdata )
Select CAST(CustomData AS XML)
from Claims.Resources_Claim cB

;WITH XMLNAMESPACES (
Default 'http://www.oceanwide.com/ZObject/2014',
'http://www.w3.org/2001/XMLSchema' as xs,
'http://www.w3.org/2001/XMLSchema-instance' as xsi)
select x.y.query('(//ZObject/Attribute[@Name = "ClaimPayment.TypeCode"]/ZObject/Value/text())')
, ISNULL(CAST(CAST(CustomData AS XML).query('sum(/ZObject/Attribute/ZObject/Attribute/ZObject/Attribute[@Name = "ClaimPayment.Amount"]/ZObject/Value/text())') as nvarchar(max)),'') AS 'amount'
,cb.*from #claims cB
CROSS APPLY CB.CustomData.nodes('/ZObject/Attribute[@Name = "ClaimPayment"]') as x(y)
where CB.customdata.exist('(//ZObject/Attribute[@Name = "ClaimPayment.TypeCode"]/ZObject/Value[. = "Indemnity"])')=1

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и набор выборочных данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;).

Yitzhak Khabinsky 16.05.2022 15:10
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, попробуйте следующее решение.

минимальный воспроизводимый пример не предоставляется. Итак, я стреляю от бедра.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, customdata XML);
INSERT INTO @tbl (customdata) VALUES
(N'<ZObject xmlns = "http://www.oceanwide.com/ZObject/2014" xmlns:xs = "http://www.w3.org/2001/XMLSchema" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
    <Attribute Name = "ClaimPayment">
        <ZObject>
            <Attribute Name = "Re4eba255bf394bdbaccba77b6edca4f5">
                <ZObject>
                    <Attribute Name = "ClaimPayment.TypeCode">
                        <ZObject>
                            <Value xsi:typeName = "xs:string">Expense</Value>
                        </ZObject>
                    </Attribute>
                    <Attribute Name = "ClaimPayment.Amount">
                        <ZObject>
                            <Value xsi:typeName = "xs:decimal">3000.0000</Value>
                        </ZObject>
                    </Attribute>
                </ZObject>
            </Attribute>
            <Attribute Name = "R0ffc51fa96594b7989a7dec13a4ddd15">
                <ZObject>
                    <Attribute Name = "ClaimPayment.TypeCode">
                        <ZObject>
                            <Value xsi:typeName = "xs:string">Indemnity</Value>
                        </ZObject>
                    </Attribute>
                    <Attribute Name = "ClaimPayment.Amount">
                        <ZObject>
                            <Value xsi:typeName = "xs:decimal">50000.0000</Value>
                        </ZObject>
                    </Attribute>
                </ZObject>
            </Attribute>
            <Attribute Name = "R64b104f17aa94ffebb75ad0b2d8b2775">
                <ZObject>
                    <Attribute Name = "ClaimPayment.TypeCode">
                        <ZObject>
                            <Value xsi:typeName = "xs:string">Indemnity</Value>
                        </ZObject>
                    </Attribute>
                    <Attribute Name = "ClaimPayment.Amount">
                        <ZObject>
                            <Value xsi:typeName = "xs:decimal">50000.0000</Value>
                        </ZObject>
                    </Attribute>
                </ZObject>
            </Attribute>
        </ZObject>
    </Attribute>
</ZObject>');
-- DDL and sample data population, end

;WITH XMLNAMESPACES 
(
    DEFAULT 'http://www.oceanwide.com/ZObject/2014',
    'http://www.w3.org/2001/XMLSchema' as xs,
    'http://www.w3.org/2001/XMLSchema-instance' as xsi
)
SELECT ID
    , Amount = SUM(c.value('(./text())[1]', 'DECIMAL(15,4)'))
FROM @tbl AS t
OUTER APPLY customdata.nodes('/ZObject/Attribute/ZObject/Attribute/ZObject[Attribute/ZObject/Value/text() = "Indemnity"]/Attribute[@Name = "ClaimPayment.Amount"]/ZObject/Value') AS t1(c)
GROUP BY ID;

Выход

+----+-------------+
| ID |   Amount    |
+----+-------------+
|  1 | 100000.0000 |
+----+-------------+

Вы можете просто суммировать в XQuery, также было бы полезно лучше расположить этот XQuery

Charlieface 16.05.2022 16:30
Ответ принят как подходящий

В этом случае вам не нужно измельчать XML с помощью .nodes, так как вы можете суммировать его исключительно в XQuery.

WITH XMLNAMESPACES 
(
    DEFAULT 'http://www.oceanwide.com/ZObject/2014',
    'http://www.w3.org/2001/XMLSchema' as xs,
    'http://www.w3.org/2001/XMLSchema-instance' as xsi
)
SELECT ID
    , Amount = customdata.value('sum(
      ZObject/Attribute/ZObject/Attribute/ZObject
      [
        Attribute[@Name = "ClaimPayment.TypeCode"]
        /ZObject/Value[text() = "Indemnity"]
      ]/Attribute[@Name = "ClaimPayment.Amount"]
      /ZObject/Value/text()
    )', 'decimal(18,9)')
FROM @tbl AS t;
Я БЫКоличество
1100000.000000000

дб <> рабочий пример

Другие вопросы по теме