2017-03-06 86 views
1

如何避免創建多個<Debtor><Creditor>元素。 下面是一個查詢我需要提高。基本上,我需要得到雙方<name><address>無論是<Creditor><Debtor>內取決於由CASE條件表示AmtCASE SELECT..FOR XML內 - 避免多個元素

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') 

需要的格式如下所示。任何幫助,好嗎?

<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> 

回答

1

更改您的選擇順序:

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')