从SQL Server 2008中的xml-field中检出值

时间:2016-07-04 09:22:25

标签: sql sql-server xml

我需要从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时)

1 个答案:

答案 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

更新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 AttribUser
      ,COUNT(*) AS CountAttribUser
FROM AllData
GROUP BY AttribUser