【问题标题】:SQL FOR XML multilevel from one pivoted table - grouping data来自一个数据透视表的 SQL FOR XML 多级 - 分组数据
【发布时间】:2014-04-30 22:09:36
【问题描述】:

这比此处发布的问题更进一步:link。提出的解决方案效果很好,但现在我遇到了一个更难的情况,并且由于 SQL 不允许创建第三个嵌套 SELECT,因此不适用相同的解决方案。 现在的情况是dub 标签可以在每个location 中重复,每个dub 可能包含多个data 标签。 一个例子:

<locations>
  <location>
    <loc name="Country 1" id="1" />
    <dubs>
      <dub name="City 1">
        <data year="1950" value="2.43" />
        <data year="1955" value="2.55" />
      </dub>
      <dub name="City 2">
        <data year="1950" value="5.67" />
        <data year="1955" value="4.42" />
      </dub>
    </dubs>
  </location>
  <location>
    <loc name="Country 2" id="2" />
    <dubs>
      <dub bane="City ABC">
        <data year="1950" value="4.54" />
        <data year="1955" value="42.15" />
      </dub>
    </dubs>
  </location>
</locations>

我尝试做第三个嵌套的SELECT,但这是不允许的: SQL Fiddle - Not Working

select T.Country as 'loc/@name',
       T.ID as 'loc/@id',
       (
         select [City] as 'dub/@name',
         (
           select 1950 as 'dub/data/@year',
                  T.[1950] as 'dub/data/@value',
                  null,
                  1955 as 'dub/data/@year',
                  T.[1955] as 'dub/data/@value'
           for xml path(''), type
          ) as dub
       ) as dubs
from YourTable as T
for xml path('location'), root('locations'), type

我修改了原始问题的解决方案并生成了以下查询,几乎可以正常工作: SQL Fiddle - Almost Working

    select T.Country as 'loc/@name',
       T.ID as 'loc/@id',
       (
         select [City] as 'dub/@name',
                 1950 as 'dub/data/@year',
                  T.[1950] as 'dub/data/@value',
                  null,
                  1955 as 'dub/data/@year',
                  T.[1955] as 'dub/data/@value'
           for xml path(''), type
       ) as dubs
from YourTable as T
for xml path('location'), root('locations'), type

但是,您会看到 data 标记没有被分组到它的 dub 标记中 - 正在使用空白的 name 属性内容重新创建 dub 标记。 有什么帮助吗?

【问题讨论】:

    标签: sql sql-server xml for-xml


    【解决方案1】:

    谢谢,Gasper,你很有帮助! (加斯帕是我想象中的朋友)

    我在下面找到了解决方案: SQL Fiddle

    select Country as 'loc/@name',
           ID as 'loc/@id',
           (
             select [City] as 'dub/@name',
               (
                   select 1950 as 'data/@year',
                      [1950] as 'data/@value',
                      null,
                      1955 as 'data/@year',
                      [1955] as 'data/@value'
                   from YourTable as D
                   where Country = C.Country
                   and City = T.City
                   for xml path(''), type
                 ) as 'dub/datavalues'
             from
             (
               select distinct City
               from YourTable
               where Country = C.Country
             ) as T
             for xml path(''), type
           ) as 'loc/dubs'
    from
    (
      select distinct Country, ID
      from YourTable
    ) as C
    for xml path(''), root('locations'), type
    

    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多