3

我有一个看起来像这样的表:

CREATE TABLE CustomerXmlData
(CustomerId int,
CustomerData xml)

CustomerId 链接到主客户表,CustomerData 是一个看起来像这样的 xml 文档

<Person>
  <Product>
    <Name>ABC</Name>
    <Value>500</Value>
  </Product>
  <Product>
    <Name>XYZ</Name>
    <Value>600</Value>
  </Product>
</Person>

有几十万这样的行。在伪代码中,我想做的是“找到where = 'XYZ' 的平均值” ValueProductName

我知道如何根据元素属性或基于文档中唯一的父级来获取值,但在这种情况下,这些都没有任何用处。我找不到任何可以让我找到Name我想要的然后获得下一个兄弟姐妹的值的东西。

我可以使用FOR XML和创建一个边缘表,但是我是否必须用光标循环遍历它?我希望有一个更有效的解决方案。

4

2 回答 2

6

我找不到任何可以让我找到我想要的名称然后获取下一个兄弟的值的东西。

declare @Name varchar(10)
set @Name = 'XYZ'

select N.value('.', 'int') as Value    
from CustomerXmlData
  cross apply CustomerData.nodes
    ('/Person/Product[Name = sql:variable("@Name")]/Value') as T(N)
于 2012-05-04T11:44:49.057 回答
2

试试这个(编辑为按名称过滤):

DECLARE @Name VARCHAR(50)
SET @Name = 'XYZ'

SELECT Name, AVG(Value) 
FROM (
SELECT 
    c.value('Name[1]', 'VARCHAR(50)') AS Name
    , c.value('Value[1]', 'DECIMAL') AS Value
FROM CustomerXmlData
CROSS APPLY CustomerData.nodes('//Product[Name = sql:variable("@Name")]') AS t(c)
) T
GROUP BY Name
于 2012-05-04T11:11:09.123 回答