2014-04-30 78 views
1

我面临着相当令人头疼的问题。在查询中合并记录的列

我有一张表,结构如下。

coursename - day1 - moment1 - day2 - moment2 - day3 - moment3 - day4 - moment4 
course A - mon - morning - wed - afternoon - NULL - NULL  - NULL - NULL 
course B - tue - evening - thu - evening - NULL - NULL  - NULL - NULL 
course C - mon - evening - tue - evening - wed - morning - thu - evening 
course D - wed - morning - thu - morning - sat - afternoon- NULL - NULL 

输出应该

coursename - timetable 
course A - mon morning, wed afternoon 
course B - tue/thu evening 
course C - mon/tue/thu evening, wed morning 
course D - wed/thu morning, sat afternoon 

我将如何去查询类似的东西?我唯一能想到的就是使用嵌套的情况,但是恐怕会杀死性能。

我使用MS SQL Server 2012的

+0

老实说,我会在前端做格式化,让数据库做它擅长的。然而,这就是说,你可能会用它来标准化你的桌子,这会让生活更轻松。 –

回答

1

如果我们有很好的字符串聚合函数,这可能是更漂亮,但只给你一个想法:

with cte as (
-- unpivot days into strings 
     select 
      T.coursename, A.day, A.moment 
     from Table1 as T 
      outer apply (values 
        (T.day1, T.moment1), 
        (T.day2, T.moment2), 
        (T.day3, T.moment3), 
        (T.day4, T.moment4) 
      ) as A(day, moment) 
), cte2 as (
-- concat all days for each moment 
    select 
     c.coursename, c.moment, 
     stuff(
     (
      select '/' + t.day 
      from cte as t 
      where t.coursename = c.coursename and t.moment = c.moment 
      for xml path(''), type 
     ).value('.', 'nvarchar(max)') 
     ,1,1,'') as days 
    from cte as c 
    group by c.coursename, c.moment 
) 
-- concat final timetable 
select 
    c.coursename, 
    stuff(
     (
     select ', ' + t.days + ' ' + t.moment 
     from cte2 as t 
     where t.coursename = c.coursename 
     for xml path(''), type 
     ).value('.', 'nvarchar(max)') 
    ,1,2,'') as timetable 
from cte2 as c 
group by c.coursename 

sql fiddle demo

+1

Knocks忽略了我正在研究的'COALESCE'想法。先生,先生! –