使用“FOR XML PATH”汇总已经汇总的值

时间:2017-07-17 19:49:30

标签: sql sql-server

我有一个表(T1),它包含一个使用FOR XML PATH连接值的列(让我们称之为OrderNumber)。最初这些OrderNumber基于值V1进行汇总,现在我需要根据新值V2再次连接这些OrderNumber以创建新表(T2)。 V1和V2都存在于表T1中,V1实际上是V2的子值。

我尝试做另一个FOR XML PATH,但它返回结构中我无法使用的值。

正确的OrderNumber以纯HTML格式

作为超链接返回
<a href="/checker/OrderInformation.aspx?SONumber=111"></a></br><a href="/checker/OrderInformation.aspx?SONumber=222"></a></br>

但是,当我尝试再次连接时,实际上会返回以下内容

<OrderNumber><a href="/checker/OrderInformation.aspx?SONumber=111"></a></br><a href="/checker/OrderInformation.aspx?SONumber=222"></a></br><a href="/checker/OrderInformation.aspx?SONumber=333"></a></br></OrderNumber>

我累了删除后面的代码中的OrdrNumber标记,但它不起作用。任何帮助将不胜感激!

[编辑]

结果表非常大,所以我将发布一些相关部分。

表1

TONumber | TOKey | OrderNumber
3672     | 231   | <a href="/checker/OrderInformation.aspx?SONumber="111"></a></br><a href="/checker/OrderInformation.aspx?SONumber="222"></a></br>
3672     | 232   | <a href="/checker/OrderInformation.aspx?SONumber="333"></a></br>
3821     | 265   | <a href="/checker/OrderInformation.aspx?SONumber="653"></a></br>

我在表1中基于TOKey(V1)连接了OrderNumber值,并且还共享相同的TONumber(V2)。我想要完成的是以下

期待

TONumber | OrderNumber 
3672     | <a href="/checker/OrderInformation.aspx?SONumber="111"></a></br><a href="/checker/OrderInformation.aspx?SONumber="222"></a></br><a href="/checker/OrderInformation.aspx?SONumber="333"></a></br>
3821     | <a href="/checker/OrderInformation.aspx?SONumber="653"></a></br>

真实结果

TONumber | OrderNumber 
3672     | <OrderNumber><a href="/checker/OrderInformation.aspx?SONumber="111"></a></br><a href="/checker/OrderInformation.aspx?SONumber="222"></a></br><a href="/checker/OrderInformation.aspx?SONumber="333"></a></br></OrderNumber>
3821     | <OrderNumber><a href="/checker/OrderInformation.aspx?SONumber="653"></a></br></OrderNumber>

代码

select T1.TONumber,
       (select T2.OrderNumber
        from Table1 T2
        where T1.TONumber = T2.TONumber
        for xml path('')) as OrderNumber
from Table1 T1
group by TONumber

我之所以提到代码背后的原因是因为我不知道如何在SQL中实现我的目标而只是尝试一下。我试图看看是否可以将它保存在存储过程中。

1 个答案:

答案 0 :(得分:0)

当然......再次使用FOR XML ......

declare @table table (TONumber int, TOKey int, OrderNumber varchar(max))
insert into @table
values
(3672,231,'<a href="/checker/OrderInformation.aspx?SONumber="111"></a></br><a href="/checker/OrderInformation.aspx?SONumber="222"></a></br>'),
(3672,232,'<a href="/checker/OrderInformation.aspx?SONumber="333"></a></br>'),
(3821,265,'<a href="/checker/OrderInformation.aspx?SONumber="653"></a></br>')

select distinct
    t.TONumber
    ,stuff((
        SELECT ', ' + cast(t2.OrderNumber as varchar(max))
        FROM @table t2
        WHERE t2.TONumber = t.TONumber
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from 
    @table t

或者您可以使用group by t.TONumber并删除不同的