Domanda

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

È stato utile?

Soluzione

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top