sql行转列

来源:互联网 发布:淘宝整点秒杀技巧 编辑:程序博客网 时间:2024/06/01 09:32

姓名课程分数

张三语文 74

张三数学 83

张三物理 93

李四语文 74

李四数学 84

李四物理 94

 

想变成(得到如下结果)

 

姓名语文数学物理

---- ---- ---- ----

李四 74   84   94

张三 74   83   93

-------------------

 

创建表:

create table stu_score(

name varchar(20),

cource varchar(20),

score int

);

INSERT INTO stu_score VALUES('zhangsan', '数学', 76);

INSERT INTO stu_score VALUES('zhangsan', '语文', 77);

INSERT INTO stu_score VALUES('zhangsan', '英语', 66);

INSERT INTO stu_score VALUES('lisi', '数学', 45);

INSERT INTO stu_score VALUES('lisi', '语文', 67);

INSERT INTO stu_score VALUES('lisi', '英语', 99);

 

步骤:

  1. 按姓名分组,分组查询字段为姓名和最大值
  2. 在最大值中设置:
    1. 如果你想查询语文成绩,那么就通过case或者if设置为正常值,将其与的分数设置为0
    2. 对这个值取sum或者max

3IF(id='某值',value1,value2)

       value1true时取值

       value2false时取值

4、如果在group by后加上WITH ROLLUP将会统计出总值。

写法:

SELECT s.name,SUM(IF(s.courcr='数学',score,0)) AS 数学,SUM(IF(s.courcr='语文',score,0)) AS 语文 ,SUM(IF(s.courcr='英语',score,0)) AS 英语 FROM stu_score s GROUP BY s.name;








sql:
SELECT st.true_name,aq.id ,aua.answer_score
FROM assess a
JOIN assess_paper    ap  ON a.paper_id=ap.id
JOIN assess_question aq  ON aq.paper_id=ap.id
JOIN assess_rule_paper arp ON arp.assess_id=a.id
JOIN assess_rule                ar  ON arp.rule_id=ar.id
JOIN assess_user_answeraua ON aq.id=aua.question_id
JOIN student st  ON st.user_id=aua.user_id
JOIN classroom       cr ON st.class_id=cr.class_id
JOIN center          c ON cr.center_id=c.center_id
JOIN series_class    sc ON sc.series_class_name=cr.series_name

结果:
true_nameidanswer_score
冯慧    15
冯慧    24
冯慧    33
冯慧    42
冯慧    51
张瑞雪11
张瑞雪21
张瑞雪31
张瑞雪41
张瑞雪51
杨玉茹13
杨玉茹23
杨玉茹33
杨玉茹43
杨玉茹53
杨月圆14
杨月圆24
杨月圆34
杨月圆44
杨月圆54
罗妃15
罗妃25
罗妃35
罗妃45
罗妃55
唐志琦15
唐志琦25
唐志琦35
唐志琦45
唐志琦55
刘江波15
刘江波25
刘江波35
刘江波45
刘江波55

行转列的sql:
SELECT true_name AS 姓名,
SUM(IF(id='1',answer_score,0)) AS 问题1,
SUM(IF(id='2',answer_score,0)) AS 问题2,
SUM(IF(id='3',answer_score,0)) AS 问题3,
SUM(IF(id='4',answer_score,0)) AS 问题4,
SUM(IF(id='5',answer_score,0)) AS 问题5

FROM (
SELECT st.true_name,aq.id ,aua.answer_score
FROM assess a
JOIN assess_paper    ap  ON a.paper_id=ap.id
JOIN assess_question aq  ON aq.paper_id=ap.id
JOIN assess_rule_paper arp ON arp.assess_id=a.id
JOIN assess_rule                ar  ON arp.rule_id=ar.id
JOIN assess_user_answeraua ON aq.id=aua.question_id
JOIN student st  ON st.user_id=aua.user_id
JOIN classroom       cr ON st.class_id=cr.class_id
JOIN center          c ON cr.center_id=c.center_id
JOIN series_class    sc ON sc.series_class_name=cr.series_name
WHERE ar.rule_name='职业发展顾问的满意度调查php1301'
AND c.center_name='北京亚运村中心'
) wsf
GROUP BY true_name  WITH ROLLUP ;

结果:

0 0