SQl Pivot帮助多个表

时间:2010-05-26 14:52:20

标签: sql pivot pivot-table

SQL Pivot帮助: 我有三个表如下: 班级表:

ID Name
1   N1
2   N2
3   N3

标志表:

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

会话表:

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

现在我需要创建一个类似这样的视图:

班级观点:

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

2 个答案:

答案 0 :(得分:2)

最好的方法是在客户端的表示层中创建逗号分隔列表。您可以将表格加在一起,如:

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

虽然数据库不是为了格式化数据,但大多数数据库都支持某种生成逗号分隔列表的方法。例如,在MySQL中,您可以使用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

如果您正在使用其他DMBS,请将其添加到您的问题中。

答案 1 :(得分:1)

this SO question开始,我发现了以下内容:

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