【问题标题】:Get Grouped Data from XML field Using XQUERY - SQL server 2008使用 XQUERY 从 XML 字段中获取分组数据 - SQL server 2008
【发布时间】:2011-03-29 23:08:49
【问题描述】:

这是我的 xml 的样子:

<Company xmlns ="http://abc.com/rules">
<Employee id="E1" number="0000007535">
   <Payment disposition="Open" type="ABC" amount_paid="100.00" />
   <Payment disposition="Closed" type="XYZ" amount_paid="468.00" />
   <Payment disposition="Open" type="AOD" amount_paid="156.00" />
   <Payment disposition="Closed" type="ONB" amount_paid="2834.00" />
</ Employee >
<Employee id="E1" number="0000007536">
   <Payment disposition="Open" type="DFG" amount_paid="200.00" />
   <Payment disposition="Closed" type="HFK" amount_paid="568.00" />
</ Employee >
<Employee id="E1" number="0000007537">
   <Payment disposition="Open" type="TTT" amount_paid="600.00" />
   <Payment disposition="Closed" type="BBB" amount_paid="368.00" />
</ Employee >
<Employee id="E2" number="0000007541">
   <Payment disposition="Open" type="EEE" amount_paid="0.00" />
   <Payment disposition="Closed" type="WWW" amount_paid="568.00" />
   <Payment disposition="Closed" type="GHW" amount_paid="968.00" />
</ Employee >
<Employee id="E2" number="0000007542">
   <Payment disposition="Open" type="QQQ" amount_paid="140.00" />
   <Payment disposition="Closed" type="CCC" amount_paid="68.00" />
</ Employee >
<Employee id="E3" number="0000007551">
   <Payment disposition="Open" type="AAA" amount_paid="300.00" />
   <Payment disposition="Closed" type="TTT" amount_paid="668.00" />
</ Employee >
</ Company>

我需要获取每个员工的所有付款信息

类似的东西:

E1 0000007535 打开 ABC 100.00

E1 0000007536 关闭 XYZ 468.00

......

E2 0000007541 打开 EEE 0.00
....

但下面的代码只给了我 Dispositon、Type 和 AmountPaid 我无法将它映射到每个 Employee。

;WITH XMLNAMESPACES (DEFAULT 'http://abc.com/rules') 
 select   Disposition,Type,AmountPaid from 
        EMPLOYEE
     OUTER APPLY
     (    
     SELECT 
     tbl.col.value('(@disposition)[1]','varchar(20)') AS Disposition, 
  tbl.col.value('(@type)[1]','varchar(20)') AS Type,
  tbl.col.value('(@amount_paid)[1]','varchar(20)') AS AmountPaid 

   FROM xmldocument.nodes('//Employee/Payment') AS tbl(col) 

 )Z  
WHERE xmlid = 500

谢谢 BB

【问题讨论】:

    标签: sql sql-server-2008 xquery-sql


    【解决方案1】:

    我不太明白这个 xml 与您的 EMPLOYEE 表中的 xmldocument 列之间的关系。 xml 是在员工行之间拆分还是一名员工在 xml 中有多个员工?无论如何,这是一种查询您提供的 XML 的方法。也许您可以使用它并根据您的情况进行调整。

    declare @xmldocument xml = '
    <Company xmlns="http://abc.com/rules">
        <Employee id="E1" number="0000007535">
            <Payment disposition="Open" type="ABC" amount_paid="100.00"/>
            <Payment disposition="Closed" type="XYZ" amount_paid="468.00"/>
            <Payment disposition="Open" type="AOD" amount_paid="156.00"/>
            <Payment disposition="Closed" type="ONB" amount_paid="2834.00"/>
        </Employee>
        <Employee id="E1" number="0000007536">
            <Payment disposition="Open" type="DFG" amount_paid="200.00"/>
            <Payment disposition="Closed" type="HFK" amount_paid="568.00"/>
        </Employee>
        <Employee id="E1" number="0000007537">
            <Payment disposition="Open" type="TTT" amount_paid="600.00"/>
            <Payment disposition="Closed" type="BBB" amount_paid="368.00"/>
        </Employee>
        <Employee id="E2" number="0000007541">
            <Payment disposition="Open" type="EEE" amount_paid="0.00"/>
            <Payment disposition="Closed" type="WWW" amount_paid="568.00"/>
            <Payment disposition="Closed" type="GHW" amount_paid="968.00"/>
        </Employee>
        <Employee id="E2" number="0000007542">
            <Payment disposition="Open" type="QQQ" amount_paid="140.00"/>
            <Payment disposition="Closed" type="CCC" amount_paid="68.00"/>
        </Employee>
        <Employee id="E3" number="0000007551">
            <Payment disposition="Open" type="AAA" amount_paid="300.00"/>
            <Payment disposition="Closed" type="TTT" amount_paid="668.00"/>
        </Employee>
    </Company>'
    
    ;with xmlnamespaces(default 'http://abc.com/rules')
    select 
      p.value('../@id', 'varchar(10)'),
      p.value('../@number', 'varchar(10)'),
      p.value('@disposition', 'varchar(10)'),
      p.value('@type', 'varchar(10)'),
      p.value('@amount_paid', 'varchar(10)')
    from @xmldocument.nodes('Company/Employee/Payment') n(p)
    

    结果

    ---------- ---------- ---------- ---------- ----------
    E1         0000007535 Open       ABC        100.00
    E1         0000007535 Closed     XYZ        468.00
    E1         0000007535 Open       AOD        156.00
    E1         0000007535 Closed     ONB        2834.00
    E1         0000007536 Open       DFG        200.00
    E1         0000007536 Closed     HFK        568.00
    E1         0000007537 Open       TTT        600.00
    E1         0000007537 Closed     BBB        368.00
    E2         0000007541 Open       EEE        0.00
    E2         0000007541 Closed     WWW        568.00
    E2         0000007541 Closed     GHW        968.00
    E2         0000007542 Open       QQQ        140.00
    E2         0000007542 Closed     CCC        68.00
    E3         0000007551 Open       AAA        300.00
    E3         0000007551 Closed     TTT        668.00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多