Question

I'm faced with quite an irritating problem.

I have a table with the following structure.

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

output should be

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

how would I go about querying something like that? only thing i can think about is using nested cases, but I'm afraid that would kill the performance.

I'm using MS SQL Server 2012

Was it helpful?

Solution

If we had good string aggregate function, this could be more pretty, but just to give you an idea:

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top