2017-03-06 2 views
1

Wie zu vermeiden, multiple <Debtor> und <Creditor> Elemente, die erstellt werden. Unten ist eine Abfrage, die ich verbessern muss. Grundsätzlich muss ich sowohl <name>10 und <address> innerhalb entweder <Creditor> oder <Debtor> abhängig von Amt ausgedrückt durch CASE Bedingung erhalten.CASE innerhalb SELECT..FOR XML - Vermeidung mehrerer Elemente

SELECT 
(SELECT [Amt/@Curr] = t.Curr 
     ,t.Amt 
     ,[EntryDetails/TxnDetails/PostClassDt] = CASE WHEN Amt < 0 THEN 'debit' END 
     ,[EntryDetails/TxnDetails/PostClassCr] = CASE WHEN Amt >= 0 THEN 'return' END 
     ,[EntryDetails/TxnDetails/Parties/Creditor/Name] = CASE WHEN Amt < 0 THEN Contractor END 
     ,[EntryDetails/TxnDetails/Parties/Debtor/Name] = CASE WHEN Amt >= 0 THEN Contractor END 
     ,[EntryDetails/TxnDetails/Parties/Creditor/Address] = CASE WHEN Amt < 0 THEN [Address] END 
     ,[EntryDetails/TxnDetails/Parties/Debtor/Address] = CASE WHEN Amt >= 0 THEN [Address] END 
FROM (VALUES 
      ('EUR', -123.45, 'John Doe','St.John'), 
      ('USD', 456.78, 'Jane Doe', 'St.Jane') 
     ) t (Curr, Amt, Contractor, [Address]) 
FOR XML PATH('Entry'), TYPE 
) [Statement] 
FOR XML PATH('Schema'), ROOT('Document') 

Erforderliche Formatierung unten. Wer hilft mir bitte?

<Document> 
     <Schema> 
     <Statement> 
      <Entry> 
      <Amt Curr="EUR">-123.45</Amt> 
      <EntryDetails> 
       <TxnDetails> 
       <PostClassDt>debit</PostClassDt> 
       <Parties> 
        <Creditor> 
        <Name>John Doe</Name> 
        <Address>St.John</Address> 
        </Creditor> 
       </Parties> 
       </TxnDetails> 
      </EntryDetails> 
      </Entry> 
      <Entry> 
      <Amt Curr="USD">456.78</Amt> 
      <EntryDetails> 
       <TxnDetails> 
       <PostClassCr>return</PostClassCr> 
       <Parties> 
        <Debtor> 
        <Name>Jane Doe</Name> 
        <Address>St.Jane</Address> 
        </Debtor> 
       </Parties> 
       </TxnDetails> 
      </EntryDetails> 
      </Entry> 
     </Statement> 
     </Schema> 
    </Document> 

Antwort

1

Ändern Sie die Reihenfolge der Auswahl:

SELECT 
(SELECT [Amt/@Curr] = t.Curr 
     ,t.Amt 
     ,[EntryDetails/TxnDetails/PostClassDt] = CASE WHEN Amt < 0 THEN 'debit' END 
     ,[EntryDetails/TxnDetails/PostClassCr] = CASE WHEN Amt >= 0 THEN 'return' END 
     ,[EntryDetails/TxnDetails/Parties/Creditor/Name] = CASE WHEN Amt < 0 THEN Contractor END 
     ,[EntryDetails/TxnDetails/Parties/Creditor/Address] = CASE WHEN Amt < 0 THEN [Address] END 
     ,[EntryDetails/TxnDetails/Parties/Debtor/Name] = CASE WHEN Amt >= 0 THEN Contractor END 
     ,[EntryDetails/TxnDetails/Parties/Debtor/Address] = CASE WHEN Amt >= 0 THEN [Address] END 
FROM (VALUES 
      ('EUR', -123.45, 'John Doe','St.John'), 
      ('USD', 456.78, 'Jane Doe', 'St.Jane') 
     ) t (Curr, Amt, Contractor, [Address]) 
FOR XML PATH('Entry'), TYPE 
) [Statement] 
FOR XML PATH('Schema'), ROOT('Document')