求助各位大神,感谢。

解决方案 »

  1.   

    语句:
    --测试数据
    ;WITH tab(教师号,星期号,是否有课)AS(
    select 1,2,'有'  union all 
    select 1,3,'有'  union all 
    select 2,1,'有'  union all 
    select 3,2,'有'  union all 
    select 1,2,'有' )
    --测试数据结束SELECT  t.教师号 ,
            ( SELECT    SUM(CASE WHEN 星期一 IS NOT NULL THEN 1
                                 ELSE 0
                            END)
              FROM      tab b
              WHERE     t.教师号 = b.教师号
              GROUP BY  b.教师号
            ) AS 星期一 ,
            ( SELECT    SUM(CASE WHEN 星期二 IS NOT NULL THEN 1
                                 ELSE 0
                            END)
              FROM      tab b
              WHERE     t.教师号 = b.教师号
              GROUP BY  b.教师号
            ) AS 星期二 ,
            ( SELECT    SUM(CASE WHEN 星期三 IS NOT NULL THEN 1
                                 ELSE 0
                            END)
              FROM      tab b
              WHERE     t.教师号 = b.教师号
              GROUP BY  b.教师号
            ) AS 星期三
    FROM    ( SELECT    教师号 ,
                        ( CASE WHEN 星期号 = 1 THEN 是否有课
                               ELSE NULL
                          END ) AS 星期一 ,
                        ( CASE WHEN 星期号 = 2 THEN 是否有课
                               ELSE NULL
                          END ) AS 星期二 ,
                        ( CASE WHEN 星期号 = 3 THEN 是否有课
                               ELSE NULL
                          END ) AS 星期三
              FROM      tab
            ) t
    GROUP BY t.教师号结果:
      

  2.   

    如果容许将原表“是否有课”一栏内的值“有”改为 ‘1’,行列转换就容易多了:> select 教师号,
     sum(if(星期号='1',是否有课,null)) as 星期1,
     sum(if(星期号='2',是否有课,null)) as 星期2,
     sum(if(星期号='3',是否有课,null)) as 星期3
     from teacher_class group by 教师号
     ;
    结果:+--------+-------+-------+-------+
    | 教师号 | 星期1 | 星期2 | 星期3 |
    +--------+-------+-------+-------+
    |      1 |  NULL |     2 |     1 |
    |      2 |     1 |  NULL |  NULL |
    |      3 |  NULL |     1 |  NULL |
    +--------+-------+-------+-------+
      

  3.   

    对不起,我昨天回复说,需将原表“是否有课”一栏内的值“有”改为 ‘1’,才能行列转换,原因是两个“有”不能相加生成‘2’。想了下,觉得可以用case语句将“有”转换成数值,不必改原表。下面是新程序:
    [code=sql]
    select 教师号,
    sum(if(星期号='1',(case when 是否有课='有' then 1 else 0 end),null)) as 星期1,
    sum(if(星期号='2',(case when 是否有课='有' then 1 else 0 end),null)) as 星期2,
    sum(if(星期号='3',(case when 是否有课='有' then 1 else 0 end),null)) as 星期3
    from teacher_class2 group by 教师号
    ;+--------+-------+-------+-------+
    | 教师号 | 星期1 | 星期2 | 星期3 |
    +--------+-------+-------+-------+
    |      1 |  NULL |     2 |     1 |
    |      2 |     1 |  NULL |  NULL |
    |      3 |  NULL |     1 |  NULL |
    +--------+-------+-------+-------+(如果不喜欢NULL,将程序中的NULL用0代替即可)