【问题标题】:How do I group multiple nested XML in SQL with FOR XML PATH depending on the column如何根据列使用 FOR XML PATH 将 SQL 中的多个嵌套 XML 分组
【发布时间】:2020-02-24 18:19:09
【问题描述】:

我有一个查询,它将我的结果格式化为 XML。虽然这是我需要的格式,但它没有对我需要分组的必要列进行分组。

SELECT (SELECT BatchNumber,
               TotalCount,
               CAST(TotalAmount AS decimal(18,2)) AS TotalAmount,
               TotalRetainage
        FOR XML PATH('Summary'), TYPE) ,
       (SELECT (    SELECT 'Success' AS ProcessStatus,
                           '' AS ProcessMessage,
                           BatchNumber AS BatchNumber,
                           '' AS TransactionNumber,
                           '' AS VoidedDate
                    FOR XML PATH('Response'), TYPE),
               AddressNumber,
               Amount,
               BusinessUnit,
               Company,
               DateGL,
               DateInvoice,
               DocumentType,
               DocumentNumber,
               GLOffset,
               LineNumber,
               NameRemark,
               PayStatusCode,
               PaymentHandlingCode,
               SupplierInvoiceNumber,
              (SELECT DetailAccountModeGL AS AccountModeGL,
                       DetailAccountNumberInput AS AccountNumberInput,
                       DetailAmount AS Amount,
                       DetailLedgerTypes LedgerTypes,
                       DetailLineNumber AS LineNumber,
                       DetailNameAlphaExplanation AS NameAlphaExplanation,
                       DetailNameRemarkExplanation AS NameRemarkExplanation,
                       DetailObjectAccount AS ObjectAccount,
                       DetailSubledgerGL AS SubledgerGL,
                       DetailSubledgerType AS SubledgerType, 
                       DetailSubsidiary AS Subsidiary
                FOR XML PATH('Details'), TYPE)
        FOR XML PATH('Invoice'), TYPE, ROOT('Invoices'))
FROM #ExpenseConsolidated 
FOR XML PATH('InvoiceIntegrationBatch')

这是我回来的结果

<InvoiceIntegrationBatch>
  <Summary>
    <BatchNumber>6.777209000000000e+006</BatchNumber>
    <TotalCount>2</TotalCount>
    <TotalAmount>0.00</TotalAmount>
    <TotalRetainage>0</TotalRetainage>
  </Summary>
  <Invoices>
    <Invoice>
      <Response>
        <ProcessStatus>Success</ProcessStatus>
        <ProcessMessage />
        <BatchNumber>6.777209000000000e+006</BatchNumber>
        <TransactionNumber />
        <VoidedDate />
      </Response>
      <AddressNumber>0.000000000000000e+000</AddressNumber>
      <Amount>2.390000000000000e+005</Amount>
      <BusinessUnit>        4362</BusinessUnit>
      <Company>04362</Company>
      <DateGL>116173</DateGL>
      <DateInvoice>116173</DateInvoice>
      <DocumentType>JG</DocumentType>
      <DocumentNumber>1.599032800000000e+007</DocumentNumber>
      <GLOffset>    </GLOffset>
      <LineNumber>0.000000000000000e+000</LineNumber>
      <NameRemark>                              </NameRemark>
      <PayStatusCode> </PayStatusCode>
      <PaymentHandlingCode>   </PaymentHandlingCode>
      <SupplierInvoiceNumber>                         </SupplierInvoiceNumber>
      <Details>
        <AccountModeGL>2</AccountModeGL>
        <AccountNumberInput>        4362.10410.582       </AccountNumberInput>
        <Amount>2.390000000000000e+005</Amount>
        <LedgerTypes>AA</LedgerTypes>
        <LineNumber>1.000000000000000e+000</LineNumber>
        <NameAlphaExplanation>TEST Alpha Explanation</NameAlphaExplanation>
        <NameRemarkExplanation>Test Name Remark Explanation</NameRemarkExplanation>
        <ObjectAccount>10410 </ObjectAccount>
        <SubledgerGL>2016    </SubledgerGL>
        <SubledgerType>X</SubledgerType>
        <Subsidiary>582     </Subsidiary>
      </Details>
    </Invoice>
  </Invoices>
</InvoiceIntegrationBatch>
<InvoiceIntegrationBatch>
  <Summary>
    <BatchNumber>6.777209000000000e+006</BatchNumber>
    <TotalCount>2</TotalCount>
    <TotalAmount>0.00</TotalAmount>
    <TotalRetainage>0</TotalRetainage>
  </Summary>
  <Invoices>
    <Invoice>
      <Response>
        <ProcessStatus>Success</ProcessStatus>
        <ProcessMessage />
        <BatchNumber>6.777209000000000e+006</BatchNumber>
        <TransactionNumber />
        <VoidedDate />
      </Response>
      <AddressNumber>0.000000000000000e+000</AddressNumber>
      <Amount>-2.390000000000000e+005</Amount>
      <BusinessUnit>        4362</BusinessUnit>
      <Company>04362</Company>
      <DateGL>116173</DateGL>
      <DateInvoice>116173</DateInvoice>
      <DocumentType>JG</DocumentType>
      <DocumentNumber>1.599032800000000e+007</DocumentNumber>
      <GLOffset>    </GLOffset>
      <LineNumber>0.000000000000000e+000</LineNumber>
      <NameRemark>                              </NameRemark>
      <PayStatusCode> </PayStatusCode>
      <PaymentHandlingCode>   </PaymentHandlingCode>
      <SupplierInvoiceNumber>                         </SupplierInvoiceNumber>
      <Details>
        <AccountModeGL>2</AccountModeGL>
        <AccountNumberInput>        4362.10410.580       </AccountNumberInput>
        <Amount>-2.390000000000000e+005</Amount>
        <LedgerTypes>AA</LedgerTypes>
        <LineNumber>2.000000000000000e+000</LineNumber>
        <NameAlphaExplanation>Test Alpha Explanation 2</NameAlphaExplanation>
        <NameRemarkExplanation>Test Name Remark Explanation 2</NameRemarkExplanation>
        <ObjectAccount>10410 </ObjectAccount>
        <SubledgerGL>2016    </SubledgerGL>
        <SubledgerType>X</SubledgerType>
        <Subsidiary>580     </Subsidiary>
      </Details>
    </Invoice>
  </Invoices>
</InvoiceIntegrationBatch>

但我真正需要的是分组在一起的发票,因为所有这些都在一个批次中,如下面的 XML:

<InvoiceIntegrationBatch>
  <Summary>
    <BatchNumber>6.777209000000000e+006</BatchNumber>
    <TotalCount>2</TotalCount>
    <TotalAmount>0.00</TotalAmount>
    <TotalRetainage>0</TotalRetainage>
  </Summary>
  <Invoices>
    <Invoice>
      <Response>
        <ProcessStatus>Success</ProcessStatus>
        <ProcessMessage />
        <BatchNumber>6.777209000000000e+006</BatchNumber>
        <TransactionNumber />
        <VoidedDate />
      </Response>
      <AddressNumber>0.000000000000000e+000</AddressNumber>
      <Amount>2.390000000000000e+005</Amount>
      <BusinessUnit>        4362</BusinessUnit>
      <Company>04362</Company>
      <DateGL>116173</DateGL>
      <DateInvoice>116173</DateInvoice>
      <DocumentType>JG</DocumentType>
      <DocumentNumber>1.599032800000000e+007</DocumentNumber>
      <GLOffset>    </GLOffset>
      <LineNumber>1</LineNumber>
      <NameRemark>                              </NameRemark>
      <PayStatusCode> </PayStatusCode>
      <PaymentHandlingCode>   </PaymentHandlingCode>
      <SupplierInvoiceNumber>                         </SupplierInvoiceNumber>
      <Details>
        <AccountModeGL>2</AccountModeGL>
        <AccountNumberInput>        4362.10410.582       </AccountNumberInput>
        <Amount>2.390000000000000e+005</Amount>
        <LedgerTypes>AA</LedgerTypes>
        <LineNumber>1.000000000000000e+000</LineNumber>
        <NameAlphaExplanation>TEST Alpha Explanation</NameAlphaExplanation>
        <NameRemarkExplanation>Test Name Remark Explanation</NameRemarkExplanation>
        <ObjectAccount>10410 </ObjectAccount>
        <SubledgerGL>2016    </SubledgerGL>
        <SubledgerType>X</SubledgerType>
        <Subsidiary>582     </Subsidiary>
      </Details>
    </Invoice>
    <Invoice>
        <Response>
            <ProcessStatus>Success</ProcessStatus>
            <ProcessMessage />
            <BatchNumber>6.777209000000000e+006</BatchNumber>
            <TransactionNumber />
            <VoidedDate />
        </Response>
        <AddressNumber>0.000000000000000e+000</AddressNumber>
        <Amount>-2.390000000000000e+005</Amount>
        <BusinessUnit>        4362</BusinessUnit>
        <Company>04362</Company>
        <DateGL>116173</DateGL>
        <DateInvoice>116173</DateInvoice>
        <DocumentType>JG</DocumentType>
        <DocumentNumber>1.599032800000000e+007</DocumentNumber>
        <GLOffset>    </GLOffset>
        <LineNumber>2</LineNumber>
        <NameRemark>                              </NameRemark>
        <PayStatusCode> </PayStatusCode>
        <PaymentHandlingCode>   </PaymentHandlingCode>
        <SupplierInvoiceNumber>                         </SupplierInvoiceNumber>
        <Details>
            <AccountModeGL>2</AccountModeGL>
            <AccountNumberInput>        4362.10410.580       </AccountNumberInput>
            <Amount>-2.390000000000000e+005</Amount>
            <LedgerTypes>AA</LedgerTypes>
            <LineNumber>2.000000000000000e+000</LineNumber>
            <NameAlphaExplanation>Test Alpha Explanation 2</NameAlphaExplanation>
            <NameRemarkExplanation>Test Name Remark Explanation 2</NameRemarkExplanation>
            <ObjectAccount>10410 </ObjectAccount>
            <SubledgerGL>2016    </SubledgerGL>
            <SubledgerType>X</SubledgerType>
            <Subsidiary>580     </Subsidiary>
        </Details>
    </Invoice>
  </Invoices>
</InvoiceIntegrationBatch>

请注意,我知道目前数据类型混乱。但是我一直在思考如何正确地将它们组合在一起。

下面是测试数据的创建和插入

CREATE TABLE #ExpenseConsolidated (
TotalCount int,
TotalAmount decimal(18,2),
TotalRetainage decimal(18,2),
BatchNumber varchar(200),
AddressNumber varchar(200),
Amount decimal(18,2),
BusinessUnit varchar(200),
Company varchar(200),
DateGL varchar(200),
DateInvoice varchar(200),
DocumentType varchar(200),
DocumentNumber varchar(200),
GLOffset varchar(200),
LineNumber varchar(200),
NameRemark varchar(200),
PayStatusCode varchar(200),
PaymentHandlingCode varchar(200),
SupplierInvoiceNumber varchar(200),
DetailAccountModeGL varchar(200),
DetailAccountNumberInput varchar(200),
DetailAmount decimal(18,2),
DetailLedgerTypes varchar(200),
DetailLineNumber varchar(200),
DetailNameAlphaExplanation varchar(200),
DetailNameRemarkExplanation varchar(200),
DetailObjectAccount varchar(200),
DetailSubledgerGL varchar(200),
DetailSubledgerType varchar(200),
DetailSubsidiary varchar(200),
DetailReverseVoid varchar(200)
)

INSERT INTO #ExpenseConsolidated 
SELECT 2,0,0,'6777209', '0', 239000, '        4362', '04362', '116173', '116173', 'JG', '15990328', '    ', '0', '', '', '', '', '2', '        4362.10410.582       ', 239000, 'AA', '1', 'Reclass Consultant Fee Sample1', 'Sample1', '10410 ', '2016    ', 'X', '582     ' , ' '
UNION
SELECT 2,0,0,'6777209', '0', -239000, '        4362', '04362', '116173', '116173', 'JG', '15990328', '    ', '0', '', '', '', '', '2', '        4362.10410.580       ', -239000, 'AA', '2', 'Reclass Consultant Fee Sample2', 'Sample2', '10410 ', '2016    ', 'X', '580     ' , ' '

【问题讨论】:

  • 如果您能提供最少的可重现样本,那就太好了。至少,DDL 和样本数据填充,即 CREATE 加上 INSERT 语句。
  • 嗨@YitzhakKhabinsky - 我添加了 DDL 创建和插入。希望你能帮我解决这个问题!
  • 我找到了答案。

标签: sql sql-server xml tsql for-xml-path


【解决方案1】:
SELECT 
(SELECT TOP 1 REPLACE(REPLACE(REPLACE(CONVERT(varchar, GETDATE(), 20), '-', ''), ' ', ''), ':','') AS BatchNumber,
           TotalCount,
           TotalAmount,
           TotalRetainage
FROM #ExpenseConsolidated  FOR XML PATH ('Summary'), ELEMENTS, TYPE),
(SELECT (   SELECT 'Success' AS ProcessStatus,
                           '' AS ProcessMessage,
                           BatchNumber AS BatchNumber,
                           '' AS TransactionNumber,
                           '' AS VoidedDate
                    FOR XML PATH('Response'), TYPE),
               AddressNumber,
               Amount,
               BusinessUnit,
               Company,
               DateGL,
               DateInvoice,
               DocumentType,
               DocumentNumber,
               GLOffset,
               LineNumber,
               NameRemark,
               PayStatusCode,
               PaymentHandlingCode,
               SupplierInvoiceNumber,
              (SELECT DetailAccountModeGL AS AccountModeGL,
                       DetailAccountNumberInput AS AccountNumberInput,
                       DetailAmount AS Amount,
                       DetailLedgerTypes LedgerTypes,
                       DetailLineNumber AS LineNumber,
                       DetailNameAlphaExplanation AS NameAlphaExplanation,
                       DetailNameRemarkExplanation AS NameRemarkExplanation,
                       DetailObjectAccount AS ObjectAccount,
                       DetailSubledgerGL AS SubledgerGL,
                       DetailSubledgerType AS SubledgerType, 
                       DetailSubsidiary AS Subsidiary
                FOR XML PATH('Details'), TYPE)
        FROM #ExpenseConsolidated 
        FOR XML PATH('Invoice'), ROOT('Invoices'), ELEMENTS, TYPE)
FOR XML PATH('InvoiceIntegrationBatch')

对于格式糟糕的问题,我深表歉意。但是下面的这个链接救了我

Combine XML from T-SQL

我基本上只是通过做前 1 来拆分总数,然后只是合并发票

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多