Суммируйте все экземпляры определенного узла в столбце XML SQL Server - PullRequest
0 голосов
/ 10 июня 2019

У меня есть следующий столбец данных xml:

<AccountingDetail>
    <DetailItems>
        <AccountingDetailItem>
            <Credit>25</Credit>
            <Debit>15100</Debit>
        </AccountingDetailItem>
        <AccountingDetailItem>
            <Credit>5</Credit>
            <Debit>150.66</Debit>
        </AccountingDetailItem>
    </DetailItems>
</AccountingDetail>

Как получить сумму всех кредитов и всех дебетов в этом столбце?Количество экземпляров варьируется от строки к строке.

Я ожидаю сумму (дебет) = 15250,66 & сумма (кредиты) = 30

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Это можно решить в XML / XQuery, который должен работать лучше, чем создание производного набора и внешнее агрегирование:

DECLARE @tbl TABLE(ID INT IDENTITY,YourXml XML);
INSERT INTO @tbl VALUES
(N'<AccountingDetail>
    <DetailItems>
        <AccountingDetailItem>
            <Credit>25</Credit>
            <Debit>15100</Debit>
        </AccountingDetailItem>
        <AccountingDetailItem>
            <Credit>5</Credit>
            <Debit>150.66</Debit>
        </AccountingDetailItem>
    </DetailItems>
</AccountingDetail>')
,('<AccountingDetail>
    <DetailItems>
        <AccountingDetailItem>
            <Credit>10</Credit>
            <Debit>20</Debit>
        </AccountingDetailItem>
        <AccountingDetailItem>
            <Credit>20</Credit>
            <Debit>40</Debit>
        </AccountingDetailItem>
        <AccountingDetailItem>
            <Credit>30</Credit>
            <Debit>60</Debit>
        </AccountingDetailItem>
    </DetailItems>
</AccountingDetail>');

SELECT t.YourXml.value('sum(//Credit)','decimal(16,4)') AS SumCredit
      ,t.YourXml.value('sum(//Debit)','decimal(16,4)') AS SumDebit
FROM @tbl t;
0 голосов
/ 10 июня 2019

Вы можете сделать это довольно легко с помощью CTE (Common Table Expression) - что-то вроде этого (при условии, что наши данные XML хранятся в переменной @XmlData XML):

-- define the CTE to extract the individual Credit and Debit values
;WITH RawXmlData (Credit, Debit) AS
(
    SELECT
        Credit = ISNULL(XC.value('(Credit)[1]', 'decimal(16,4)'), 0.0),
        Debit = ISNULL(XC.value('(Debit)[1]', 'decimal(16,4)'), 0.0)
    FROM
        @XmlData.nodes('/AccountingDetail/DetailItems/AccountingDetailItem') XT(XC)
)
-- now select from that CTE and sum up the values
SELECT
    SumCredit = SUM(Credit),
    SumDebit = SUM(Debit)
FROM
    RawXmlData
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...