【问题标题】:SQL Server XML query adding a sequence numberSQL Server XML 查询添加序列号
【发布时间】:2018-09-07 20:44:17
【问题描述】:

我有一个示例查询,它基本上循环支付并输出以下结果。我需要添加一个新的列序列号并填充序列值。我怎样才能做到这一点。

1235645 credit-card VISA 325.4800   1
1235645 gift-card   CD   325.4800   2
1235645 gift-card   MC   325.4800   3

** 预期结果:上面最后一列的序列号:

DECLARE @XML AS XML=
N'<order xmlns="somenamspace/2006-10-31" order-no="1235645">
  <order-date>2017-07-24T20:48:57.000Z</order-date>
  <original-order-no>00000001</original-order-no>
  <customer>
    <customer-name>abcd abcd</customer-name>
    <customer-email>jjj@gmail.com</customer-email>
  </customer>
  <current-order-no>1235645</current-order-no>
  <payments>
    <payment>
      <credit-card>
        <card-type>VISA</card-type>
        <card-number>XXXX-XXXX-XXXX-1111</card-number>
        <card-holder>abcd</card-holder>
      </credit-card>
      <gift-card>
        <card-type>CD</card-type>
        <card-number>465795</card-number>
      </gift-card>
      <gift-card>
        <card-type>MC</card-type>
        <card-number>2345678</card-number>
      </gift-card>
      <amount>325.48</amount>
    </payment>
  </payments>
</order>';

WITH XMLNAMESPACES(DEFAULT N'somenamspace/2006-10-31')
    SELECT 
        @xml.value(N'(/order/@order-no)[1]',N'int') AS OrderNumber,
        p.value(N'local-name(.)',N'nvarchar(max)') AS PaymentType,
        p.value(N'(card-type/text())[1]','nvarchar(max)') AS CardType,
        p.value(N'(../amount/text())[1]','decimal(10,4)') AS Amount
    FROM 
        @xml.nodes(N'/order/payments/payment/*[local-name()!="amount"]') AS A(p)

【问题讨论】:

  • 请加上预期的输出...这个序号应该怎么算?
  • 添加了预期的输出。谢谢你的解释。

标签: sql sql-server xml qxmlquery


【解决方案1】:

可能就是你要找的这个:

WITH XMLNAMESPACES(DEFAULT N'somenamspace/2006-10-31')
SELECT
    ROW_NUMBER() OVER(PARTITION BY p.value(N'local-name(.)',N'nvarchar(max)') ORDER BY (SELECT NULL)) AS SequenceNumber, 
    @xml.value(N'(/order/@order-no)[1]',N'int') AS OrderNumber,
    p.value(N'local-name(.)',N'nvarchar(max)') AS PaymentType,
    p.value(N'(card-type/text())[1]','nvarchar(max)') AS CardType,
    p.value(N'(../amount/text())[1]','decimal(10,4)') AS Amount
FROM 
    @xml.nodes(N'/order/payments/payment/*[local-name()!="amount"]') AS A(p)

您可以删除PARTITION BY p.value(N'local-name(.)',N'nvarchar(max)')。有了这个,它将重新启动每个 PaymentType 的计数器,没有这个,你只会得到从 1 到 n 的付款编号。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 2012-10-18
    • 2011-07-04
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多