views:

133

answers:

2

SQL Pivot Help: I have three tables as follows: Class Table:

ID Name
1   N1
2   N2
3   N3

Flags Table:

ID  ClassID  Flags
1      1       F1
1      1       F2
1      2       F3
1      3       F1
1      3       F3

Session Table:

ID   ClassID  Session
1       1       S1
2       1       S2
3       1       S3
4       2       S2
5       2       S5
6       3       S1
6       3       S2

Now I need to create a view something like this:

Class View:

ID  Name       Flags       Session
1    N1        F1,F2       S1,S2,S3
2    N2          F3          S2,S5
3    N3        F1,F3         S1,S2
+1  A: 

The best approach would be to create the comma separated lists in the presentation layer of the client. You can join the tables together like:

select 
    class.id
,   class.name
,   flags.flags
,   session.session
from class
left join flags on flags.classid = class.id
left join session on session.classid = class.id

Although databases are not meant to format data, most databases support some way of generating comma separated lists. For example, in MySQL, you can use group_concat:

select 
    class.id
,   class.name
,   group_concat(flags.flags separator ',')
,   group_concat(session.session separator ',')
from class
left join flags on flags.classid = class.id
left join session on session.classid = class.id
group by class.id, class.name

If you're using another DMBS, please add it to your question.

Andomar
I'm using SQL Server. Will this work for it?
Deepak
For SQL Server, the usual approach is a `for xml` trick, see http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html
Andomar
+1 For providing precious information.
Will Marcouiller
+1  A: 

From this SO question, I figured out the following:

select fs.ClassId
    , fs.ClassName
    , LEFT(fs.Flags, LEN(fs.Flags) - 2) as Flags
    , LEFT(fs.Sessions, LEN(fs.Sessions) - 2) as Sessions
from (
    select c.Id as ClassId
            , c.[Name] as ClassName
            , (
                select Flags + N', ' as [text()]
                    from FlagsTable
                    where ClassId = c.Id
                    FOR XML PATH (N'')
            ) as Flags
            , (
                select Session + N', ' as [text()]
                    from SessionTable
                    where ClassId = c.Id
                    FOR XML PATH (N'')
            ) as Sessions
        from ClassTable c
    ) fs
Will Marcouiller