我有一张看起来像这样的表:
CREATE TABLE CustomerXmlData
(CustomerId int,
CustomerData xml)
CustomerId链接到主customer表,CustomerData是一个xml文档,看起来像这样
<Person>
<Product>
<Name>ABC</Name>
<Value>500</Value>
</Product>
<Product>
<Name>XYZ</Name>
<Value>600</Value>
</Product>
</Person>
有几十万个这样的行。在伪代码中,我想要做的是“查找Value
Product
='XYZ'”的平均Name
。
我知道如何根据元素属性或基于文档中具有唯一性的父级来获取值,但在这种情况下这些都不是任何用途。我找不到任何可以让我找到我想要的Name
,然后获得下一个兄弟的价值的东西。
我可以使用FOR XML
并创建一个边缘表,但是我是否必须使用游标遍历它?我希望有一个更有效的解决方案。
答案 0 :(得分:5)
我找不到任何能让我找到我想要的名字的东西 然后得到下一个兄弟的价值。
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)
答案 1 :(得分:1)
尝试此操作(已编辑为按名称过滤):
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