T-SQL连接多行

时间:2014-12-17 23:37:17

标签: sql sql-server tsql

我正在尝试将一个单独的表连接到我的结果中,但与我读过的其他一些问题的方法不完全相同。 有一个类表:

ClassID
-------
1
2
3

和调度表

ClassID    Block    Day
-------    -----    ---
1          5        1
1          4        2
1          5        2
2          2        1
2          3        2
3          1        1
3          1        2
3          1        3

我想要的输出是按类别按块分组,并连接成一行,如下所示:

ClassID    Schedule
-------    --------
1          5(1,2) 4(2)
2          1(2) 2(3)
3          1(1,2,3)

这可能吗?另一个可接受的(可能更容易的)输出是

ClassID    Schedule
-------    --------
1          5(1) 5(2) 4(2)
2          1(2) 2(3)
3          1(1) 1(2) 1(3)

2 个答案:

答案 0 :(得分:0)

您可以使用STUFFFOR XML PATH将逗号等分隔符连接到列值列表。

在这种情况下,您需要以嵌套方式执行此操作,一次连接特定block的日期,然后根据class进一步连接此日期

此外,在GUI层中做得更好,因为这种操作会影响性能。

<强> SQL Fiddle

select classId, stuff(
         (select distinct ' ' + T2.block  + '(' +
         stuff((select  ','+ T1.Day 
         from Table1 T1
         where T1.classId = T2.classId
         and T1.Block = T2.Block
         FOR XML PATH ('')),
               1,1,'') +')'
         from Table1 T2
         where T2.classId = T.classId
         for xml path('')), 1,1,'')

from Table1 T
group by classId

答案 1 :(得分:0)

使用:

select ClassID
    ,
    stuff
    ((
        select ' ' + t1.Block + '(' +
        stuff
            ((
                select ',' + t2.Day
                from table1 t2
                where t2.ClassID = t.ClassID and t2.Block = t1.Block
                for xml path('')
            ), 1, 1, '') + ')'
        from table1 t1
        where t1.ClassID = t.ClassID
        group by t1.Block
        for xml path('')
    ), 1, 1, '')
from table1 t
group by t.ClassID