CREATE TABLE students(
  id INT PRIMARY KEY,
  NAME VARCHAR(11)
);

CREATE TABLE courses(
  id INT PRIMARY KEY,
  NAME VARCHAR(11)
);

CREATE TABLE scores(
  sid INT,
  cid INT,
  score INT,
  RIMARY KEY (sid,cid)
);

3表关联查询:

SELECT st.id,st.name,c.NAME course,sc.score FROM students st
LEFT JOIN scores sc ON st.id=sc.sid
LEFT JOIN courses c ON sc.cid=c.id

将课程分类转为列名,其列值为分数:

SELECT t.id,t.name,
CASE course WHEN '语文' THEN score ELSE 0 END a,
CASE course WHEN '数学' THEN score ELSE 0 END b,
CASE course WHEN '英语' THEN score ELSE 0 END c,
CASE course WHEN '历史' THEN score ELSE 0 END d

FROM

(SELECT st.id,st.name,c.NAME course,sc.score FROM students st
LEFT JOIN scores sc ON st.id=sc.sid
LEFT JOIN courses c ON sc.cid=c.id) t

对上表按人员id分组,并将分完组的个列分数相加,组合到一行中,并对行求和:

SELECT t2.id,t2.name,SUM(a) '语文',SUM(b) '数学',SUM(c) '英语',SUM(d) '历史',SUM(a+b+c+d) '总分' FROM
(
  SELECT t.id,t.name,
  CASE course WHEN '语文' THEN score ELSE 0 END a,
  CASE course WHEN '数学' THEN score ELSE 0 END b,
  CASE course WHEN '英语' THEN score ELSE 0 END c,
  CASE course WHEN '历史' THEN score ELSE 0 END d

  FROM

    (SELECT st.id,st.name,c.NAME course,sc.score FROM students st
    LEFT JOIN scores sc ON st.id=sc.sid
    LEFT JOIN courses c ON sc.cid=c.id) t

) t2
GROUP BY t2.id;

mysql 行转列,对列的分组求和,对行求和的更多相关文章

  1. mysql 多行(GROUP_CONCAT)和多列(CONCAT)的合并函数

    1,多行合并:把查询的一行或者多行进行合并. SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id ...

  2. mysql之行转列与列转行

    mysql之行转列与列转行是数据查询的常见操作,以更好的来展示数据,下面就详细说说怎么实现. 行转列 行转列的话,就是将一条一条的行数据记录转换为一条列数据展示,一般来说是根据某一列来做汇总数据的操作 ...

  3. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  4. 在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)

    原文:在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 1.如果去掉这个临时表中合计为0 ...

  5. (转载)重温SQL——行转列,列转行

    原文地址:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通 ...

  6. 【转载】SQL Server行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  7. oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...

  8. SQL行转列与列转行(转)

    原文: http://blog.csdn.net/jx_870915876/article/details/52403472 add by zhj: 本文是以MySQL为例说明的,但其实它适用于所有关 ...

  9. mysql explain中的type列含义和extra列的含义

    很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是“访问类型”,更通俗一点就是: ...

  10. 重温SQL——行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

随机推荐

  1. PHP面向对象深入研究之【高级特性】

    静态属性 <?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHel ...

  2. oracle自动创建表分区

    创建一个table,记录哪些表需要创建表分区 create table STAT_TABLE ( tablename VARCHAR2(), pre_partition_name VARCHAR2() ...

  3. C Primer Plus学习笔记(十)- 字符串和字符串函数

    getchar() 和 putchar() getchar() 函数不带任何参数,它从输入队列中返回下一个字符 下面的语句读取下一个字符输入,并把该字符的值赋给变量 ch ch =getchar(); ...

  4. vue-cli脚手架build目录下utils.js工具配置文件详解

    此文章用来解释vue-cli脚手架build目录中的utils.js配置文件 此配置文件是vue开发环境的wepack相关配置文件,主要用来处理css-loader和vue-style-loader ...

  5. 1.4 Application应用

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app.app应用是我们使用celery所有功能的入口,比如创建任务,管 ...

  6. 2009-2010网络最热的&nbsp;嵌入式…

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

  7. Usage of API documented as @since 1.8+”报错的解决办法

    参考资料 1.https://blog.csdn.net/a499477783/article/details/78967586/

  8. SecureCRT中某些命令提示符下按Backspace显示^H的解决方法

    SecureCRT中某些命令提示符下按Backspace显示^H的解决方法 安装了Apache Derby数据库服务器之后,使用ij客户端去连接derby服务端,可是在ij中输入命令的时候,每当输入错 ...

  9. .find()和.index()的区别

    今天在复习基本数据类型——字符串的时候,有一点想法,总结一下: 字符串的定义:字符串是一个有序的字符集合,用于存储和表示基本的文字信息,用‘,“,‘’‘括起来的称之为字符串. 字符串的操作有很多种,比 ...

  10. 因采用 Flask 原生 WSGI 出现 "Broken pipe" 报错的故障处理

    :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...