Как сгруппировать несколько вложенных XML в SQL с помощью FOR XML PATH в зависимости от столбца - PullRequest
0 голосов
/ 29 октября 2019

У меня есть запрос, который форматирует мои результаты в 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     ' , ' '

1 Ответ

0 голосов
/ 29 октября 2019
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')

Прошу прощения за ужасно отформатированный вопрос. Но эта ссылка ниже спасла меня

Объединение XML из T-SQL

Я просто разделил итоги, выполнив первую 1, а затем просто объединил Счета

...