2017-03-06 5 views
1

複数の要素を避ける方法<Debtor><Creditor>要素が作成されました。 以下は改善が必要なクエリです。基本的には<name><address>の両方を<Creditor>または<Debtor>のどちらかに入れて、Amtによると、CASEの条件で表現する必要があります。CASE内部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') 
関連する問題