mysql高级查询-行列互转

行转列

题目1

image.png
CREATE TABLE students_scores (
    id INT AUTO_INCREMENT,
    name VARCHAR(50),
    subject VARCHAR(50),
    score INT,
    PRIMARY KEY(id)
);
INSERT INTO students_scores (name, subject, score) VALUES
('张三', '语文', 78),
('张三', '数学', 88),
('张三', '英语', 98),
('李四', '语文', 89),
('李四', '数学', 76),
('李四', '英语', 90),
('王五', '语文', 99),
('王五', '数学', 66),
('王五', '英语', 91);
select name, sum(语文) as 语文, sum(数学) as 数学, sum(英语) as 英语

from (select *,
             case students_scores.subject when "语文" then students_scores.score else 0 end as 语文,
             case students_scores.subject when "数学" then students_scores.score else 0 end as 数学,
             case students_scores.subject when "英语" then students_scores.score else 0 end as 英语

      from students_scores) as ss
group by name;


select name,
       sum(case students_scores.subject when "语文" then students_scores.score else 0 end) as 语文,
       sum(case students_scores.subject when "数学" then students_scores.score else 0 end) as 数学,
       sum(case students_scores.subject when "英语" then students_scores.score else 0 end) as 英语

from students_scores
group by name

解题步骤

  1. 确定分组列,转换列,数据列
  2. 生成伪列
  3. 做分组查询
  4. 选择合适的聚合函数

题目2

image.png

select results.ddate,
    count( case results.result when '胜' then 1 else null end )  as 胜,
       count(  case results.result when '负' then 1 else null end ) as 负
from results

group by  ddate

select results.ddate,
    sum( case results.result when '胜' then 1 else 0 end )  as 胜,
       sum(  case results.result when '负' then 1 else 0 end ) as 负
from results

group by  ddate

行转列

image.png
select  name, '语文' as subject, 语文 as  score from  students_scores2
union  all
select  name, '数学' as subject, 数学 as  score from  students_scores2
union  all
select  name, '英文' as subject, 英语 as  score from  students_scores2
order by  name
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 幕课oracle学习笔记 --!!!scott用户 --一.分组查询 --1.常用的分组函数:AVG(平均数),S...
    xiaoxiao苏阅读 1,289评论 0 5
  • 想要将查询到的成绩行转列,即转化每个学生成绩为一行,每个学科为一列 使用case语句:当课程名称等于公共课,就将此...
    漫漫_mm阅读 569评论 0 1
  • 一、行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容。 建表语句 插入数据 查询数据表中的内容(即...
    尘埃里的玄阅读 781评论 0 2
  • 行列互转问题 行转列 从数据的行拆出数据的列,即把观测的属性(行)拆成一个变量(列)。附注1.其实我一开始觉得这是...
    茬茬阅读 122评论 0 0
  • 本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表...
    星期五与糖糖阅读 1,238评论 0 3