【问题标题】:Obtain a count of XML elements per group in SQL获取 SQL 中每组的 XML 元素计数
【发布时间】:2012-10-06 04:25:28
【问题描述】:

我有一个类似于以下内容的 XML 列;

DECLARE @str AS VARCHAR(8000)

SET @str = '<Root xmlns="http://myurl.com/services/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
           <Notifications>
               <Notification>
                  <NotificationDate>2012-08-16</NotificationDate>
                  <Scopes>
                    <NotificationScope>
                        <Code>a</Code>
                    </NotificationScope>  
                    <NotificationScope>
                        <Code>b</Code> 
                    </NotificationScope>
                  </Scopes>
                </Notification>
                <Notification>
                  <NotificationDate>2012-08-20</NotificationDate>
                  <Scopes>
                    <NotificationScope>
                        <Code>a</Code>
                    </NotificationScope>
                  </Scopes>
                </Notification>
            </Notifications></Root>'

我希望能够计算每个通知的 NotificationScope 元素数量。例如,我正在寻找类似的东西;

Notification Date                   Count
 2012-08-16                          2
 2012-08-20                          1

事实上,由于这些数据实际上是从数据库列中获取的,我真的只对返回那些具有任何通知日期且计数大于 1 的记录感兴趣。

到目前为止,我想出的只是以下内容,但这只是给了我一个计数;

declare @xmlvar XML;
set @xmlvar = (SELECT cast(@str AS XML))
;WITH XMLNAMESPACES('http://myurl.com/services/' AS p)
SELECT * FROM (
select @xmlvar.value('count(/p:Root/p:Notifications/p:Notification/p:Scopes/p:NotificationScope)', 'INT') AS 'NotificationScopeCount',
       @xmlvar.value('count(/p:Root/p:Notifications/p:Notification/p:NotificationDate)', 'INT') AS 'NotificationDateCount'
 ) a WHERE NotificationScopeCount > NotificationDateCount

但理想情况下,我也希望能够获得相关日期。如果这是一种可怕的处理方式,请原谅我,我以前在 SQL 中没有使用过 XML 数据类型。

【问题讨论】:

    标签: xml sql-server-2005 grouping


    【解决方案1】:

    你可以尝试使用这样的东西:

    ;WITH XMLNAMESPACES('http://myurl.com/services/' AS p)
    SELECT
        NotificationDate = Notif.value('(p:NotificationDate)[1]', 'DATE'),
        CodeCount = Notif.value('count(p:Scopes/p:NotificationScope/p:Code)', 'int')
    FROM
        @xmlvar.nodes('/p:Root/p:Notifications/p:Notification') AS Tbl(Notif)
    

    给我一​​个输出:

    【讨论】:

    • 谢谢。 NotificationDate 列中的 [1] 是否充当聚合类型的值?
    • @MrMoose:不,[1] 只选择由该 XPath 定义的 XML 节点列表中的第一个(可能是多个)条目。由于您的 &lt;Notification&gt; 节点只包含一个 &lt;NotificationDate&gt; (我假设这个),这就是您想要的 - 您从通知节点获得 the 通知日期。我这里的代码还没有做任何聚合——如果你需要,你必须自己聚合(例如,通过将它包装到 CTE 中,然后在日期列上执行 GROUP BY
    • 优秀。感谢那。我已经查看了 your question 关于如何将 cte 与 xmlnamespaces 结合以了解如何实现这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2011-07-08
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多