在SQL Server 2008中检查XML字段的值

3

我需要从一个XML字段中获取一些数据。特别的问题是该XML字段本身。

这个XML字段的构建方式如下:

<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初学者,尤其是在处理XML方面)。

1个回答

2

我不理解你的计数方式,但这可能会推动你走向正确的方向:

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

希望这能帮到您...

更新

虽然我不太理解您的逻辑,但这可能更接近您的要求:

CTE“AllData”提供了所有数据的列表(与以前相同)

在最终的SELECT中,根据XML中用户编号的顺序计算每个用户的答案数量。对于1、2和4(零==不存在),这是可以的,但是您在期望输出中没有提到更多的ID...

如果您需要显示所有ID(包括0的4个),则需要一个所有用户的列表和XML数据的LEFT JOIN...

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

更新 2

根据 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 DistinctUsers.use_PostingUser
      ,COUNT(AllData.AttribUser) AS CountAttribUser
FROM @tbl AS DistinctUsers
LEFT JOIN AllData ON DistinctUsers.use_PostingUser=AllData.AttribUser
GROUP BY DistinctUsers.use_PostingUser

我认为用户列表仅从源表中获取,而不是XML。 - Y.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接