我需要从xml字段中获取一些数据。 特殊问题是xml-field本身。
xml-field以这种方式构建:
<UseAnsw>
<User User="3" Answ="N" />
<User User="2" Answ="N" />
<User User="7" Answ="N" />
<User User="5" Answ="N" />
<User User="1" Answ="N" />
</UseAnsw>
Sql表还有一个列,其中包含发布问题的用户。 我需要做的是,计算用户回答问题的频率。
作为例子:
use_ID use_PostingUser use_UseAnsw
00001 2 <UseAnsw>
<User User="3" Answ="N" />
<User User="1" Answ="N" />
<User User="7" Answ="N" />
</UseAnsw>
00002 4 <UseAnsw>
<User User="2" Answ="N" />
<User User="1" Answ="N" />
<User User="3" Answ="N" />
</UseAnsw>
00003 1 <UseAnsw>
<User User="3" Answ="N" />
<User User="5" Answ="N" />
<User User="8" Answ="N" />
</UseAnsw>
我寻找的那个例子的结果将是:
User AnswersGiven
1 2
2 1
4 0
我希望有人能理解我正在尝试的内容并且能够帮助我(一个sql-beginner,特别是当涉及到xml时)
答案 0 :(得分:2)
我不明白你的计数如何运作,但这可能会让你走上正确的道路:
theme={theme.title}
此查询将返回所有数据
DECLARE @tbl TABLE(use_ID VARCHAR(100),use_PostingUser INT,use_UseAnsw XML);
INSERT INTO @tbl VALUES
('00001',2,'<UseAnsw>
<User User="3" Answ="N" />
<User User="1" Answ="N" />
<User User="7" Answ="N" />
</UseAnsw>')
,('00002',4,'<UseAnsw>
<User User="2" Answ="N" />
<User User="1" Answ="N" />
<User User="3" Answ="N" />
</UseAnsw>')
,('00003',1,'<UseAnsw>
<User User="3" Answ="N" />
<User User="5" Answ="N" />
<User User="8" Answ="N" />
</UseAnsw>');
在这里,我使用相同的方法返回列SELECT use_ID,use_postingUser
,Usr.value('@User','int') AS AttribUser
,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
及其use_postingUser
元素的数量(实际上是同名的属性)
User
希望这会有所帮助......
我仍然不明白你的逻辑,但这可能会更接近:
SELECT use_postingUser
,COUNT(Usr.value('@User','int')) AS CountAttribUser
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
GROUP BY use_PostingUser
“AllData”提供所有数据的列表(如前所述)
在最终CTE
中,根据用户编号 中的每个用户的答案计数,计算XML。对于1,2和4(零==不存在),这是可以的,但是在预期的输出中没有提到更多的ID ......
如果您需要所有ID dsiplayed(4为零),您需要一个包含所有用户的列表和一个SELECT
到XML的数据......
LEFT JOIN
根据Y.B的评论,可能是这样的:(使用上面声明的表变量)
WITH AllData AS
(
SELECT use_ID,use_postingUser
,Usr.value('@User','int') AS AttribUser
,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
)
SELECT AttribUser
,COUNT(*) AS CountAttribUser
FROM AllData
GROUP BY AttribUser