语句: --测试数据 ;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.教师号结果:
如果容许将原表“是否有课”一栏内的值“有”改为 ‘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 | +--------+-------+-------+-------+
对不起,我昨天回复说,需将原表“是否有课”一栏内的值“有”改为 ‘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代替即可)
--测试数据
;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.教师号结果:
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 |
+--------+-------+-------+-------+
[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代替即可)