【问题标题】:CASE inside SELECT..FOR XML - avoiding multiple elementsSELECT..FOR XML 中的 CASE - 避免多个元素
【发布时间】:2017-03-06 14:51:19
【问题描述】:

如何避免创建多个<Debtor><Creditor> 元素。 以下是我需要改进的查询。基本上我需要在<Creditor><Debtor> 中同时获得<name><address>,这取决于AmtCASE 条件表示。

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>

【问题讨论】:

    标签: sql-server-2008 sqlxml


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2013-12-03
      • 2020-04-15
      相关资源
      最近更新 更多