查询  每个学生 的  (姓名,语文,数学,英语,成绩)为列

表结构如下:

student: 学生表

grade 成绩表 :

查询出如下效果:

SQL如下:

select s.name,a.* from student s,
(select sid,
max(CASE kemu WHEN '语文' THEN chengji ELSE 0 END) '语文',
max(CASE kemu WHEN '数学' THEN chengji ELSE 0 END) '数学',
max(CASE kemu WHEN '英语' THEN chengji ELSE 0 END) '英语'
from grade GROUP BY sid ) a
where s.id = a.sid

  

系统知识:

来自MySQL触发器里的流程控制语句 知识。

MySQL 的 case when 的语法有两种:

  1. 简单函数 
    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
  2. 搜索函数 
    CASE WHEN [expr] THEN [result1]…ELSE [default] END

这两种语法有什么区别呢?

简单函数

CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚举这个字段所有可能的值*

SELECT
NAME '英雄',
CASE NAME
WHEN '德莱文' THEN
'斧子'
WHEN '德玛西亚-盖伦' THEN
'大宝剑'
WHEN '暗夜猎手-VN' THEN
'弩'
ELSE
'无'
END '装备'
FROM
user_info;
SELECT
NAME '英雄',
CASE NAME
WHEN '德莱文' THEN
'斧子'
WHEN '德玛西亚-盖伦' THEN
'大宝剑'
WHEN '暗夜猎手-VN' THEN
'弩'
ELSE
'无'
END '装备'
FROM
user_info;

搜索函数

CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

# when 表达式中可以使用 and 连接条件
SELECT
NAME '英雄',
age '年龄',
CASE
WHEN age < 18 THEN
'少年'
WHEN age < 30 THEN
'青年'
WHEN age >= 30
AND age < 50 THEN
'中年'
ELSE
'老年'
END '状态'
FROM
user_info;

聚合函数 sum 配合 case when 的简单函数实现行转列
SELECT
st.stu_id '学号',
st.stu_name '姓名',
sum(
CASE co.course_name
WHEN '大学语文' THEN
sc.scores
ELSE
0
END
) '大学语文',
sum(
CASE co.course_name
WHEN '新视野英语' THEN
sc.scores
ELSE
0
END
) '新视野英语',
sum(
CASE co.course_name
WHEN '离散数学' THEN
sc.scores
ELSE
0
END
) '离散数学',
sum(
CASE co.course_name
WHEN '概率论与数理统计' THEN
sc.scores
ELSE
0
END
) '概率论与数理统计',
sum(
CASE co.course_name
WHEN '线性代数' THEN
sc.scores
ELSE
0
END
) '线性代数',
sum(
CASE co.course_name
WHEN '高等数学' THEN
sc.scores
ELSE
0
END
) '高等数学'
FROM
edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BY
st.stu_id
ORDER BY
NULL;

行转列测试数据

-- 创建表  学生表
CREATE TABLE `edu_student` (
`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',
`stu_name` VARCHAR (20) NOT NULL COMMENT '学生姓名',
PRIMARY KEY (`stu_id`)
) COMMENT = '学生表' ENGINE = INNODB; -- 课程表
CREATE TABLE `edu_courses` (
`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',
`course_name` VARCHAR (100) NOT NULL COMMENT '课程名称',
PRIMARY KEY (`course_no`)
) COMMENT = '课程表' ENGINE = INNODB; -- 成绩表
CREATE TABLE `edu_score` (
`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',
`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',
`scores` FLOAT NULL DEFAULT NULL COMMENT '得分',
PRIMARY KEY (`stu_id`, `course_no`)
) COMMENT = '成绩表' ENGINE = INNODB; -- 插入数据 -- 学生表数据 INSERT INTO edu_student (stu_id, stu_name)
VALUES
('1001', '盲僧'),
('1002', '赵信'),
('1003', '皇子'),
('1004', '寒冰'),
('1005', '蛮王'),
('1006', '狐狸'); -- 课程表数据
INSERT INTO edu_courses (course_no, course_name)
VALUES
('C001', '大学语文'),
('C002', '新视野英语'),
('C003', '离散数学'),
(
'C004',
'概率论与数理统计'
),
('C005', '线性代数'),
('C006', '高等数学'); -- 成绩表数据
INSERT INTO edu_score (stu_id, course_no, scores)
VALUES
('1001', 'C001', 67), ('1002', 'C001', 68), ('1003', 'C001', 69), ('1004', 'C001', 70), ('1005', 'C001', 71),
('1006', 'C001', 72), ('1001', 'C002', 87), ('1002', 'C002', 88), ('1003', 'C002', 89), ('1004', 'C002', 90),
('1005', 'C002', 91), ('1006', 'C002', 92), ('1001', 'C003', 83), ('1002', 'C003', 84), ('1003', 'C003', 85),
('1004', 'C003', 86), ('1005', 'C003', 87), ('1006', 'C003', 88), ('1001', 'C004', 88), ('1002', 'C004', 89),
('1003', 'C004', 90), ('1004', 'C004', 91), ('1005', 'C004', 92), ('1006', 'C004', 93), ('1001', 'C005', 77),
('1002', 'C005', 78), ('1003', 'C005', 79);

SQL 列 转换成 查询出来的 行的更多相关文章

  1. MS SQL Server2000转换成MySQL

    按计划今天着手进行将后台数据库从MS SQL Server2000转换成MySQL5.1.3.目的是便于发布软件的测试版本. 1. 驱动: mysql-connector-odbc-5.1.11-wi ...

  2. C#将datatable的某一列转换成json格式的字符串

    将datatable的某一列转换成json格式的字符串(转换完后自己在字符串前后加{}) /// <summary> ///DataTable装换 Column数据 组合成json 现在的 ...

  3. 怎么将oracle的sql文件转换成mysql的sql文件

    怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...

  4. 【HIVE】sql语句转换成mapreduce

    1.hive是什么? 2.MapReduce框架实现SQL基本操作的原理是什么? 3.Hive怎样实现SQL的词法和语法解析? 连接:http://www.aboutyun.com/thread-20 ...

  5. SQL 汉字转换成拼音首字母 首字母查

    -- ============================================= -- 功能:汉字转换成拼音首字母 首字母查 -- ========================== ...

  6. C#连接数据库SQL,并转换成list形式

    web config 配置 <connectionStrings>    <add name="SQLConnString" connectionString=& ...

  7. 数据库中的java.sql.Timestamp转换成Date

    查询数据库中的时间类型为 java.sql.Timestamp 保存在json中需要格式化 自定义工具类  DateJsonValueProcessor package com.rom.util; i ...

  8. DB2数据库多行一列转换成 一行一列

    在db2中遇到多行一列转为一行一列的需求时,用db2函数 LISTAGG可以实现该功能.语法如下: SELECT   [分组的字段 ] , LISTAGG([需要聚合的字段名], ',')   FRO ...

  9. PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM

    从SQL文件逆向工程到PDM: ①选择file -> Reverse Engineer - > Database ②在General选项卡中选择MySQL数据库,点击确定. ③using ...

随机推荐

  1. Android <Android应用开发实战> 资源类型<一>

    1.字符串资源>>1.普通字符串>>2.字符串数组 <resources> <string-array name="planets_array&qu ...

  2. POJ2406:Power Strings——题解

    http://poj.org/problem?id=2406 就是给一个串,求其循环节的个数. 稍微想一下就知道,KMP中nxt数组记录了所有可与前面匹配的位置. 那么如果我们的循环节长度为k,有n个 ...

  3. bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    又是久违的1A哇... 好喵喵的题!二分a[p],把大于mid的数改为1,小于等于mid的数改为0,变成01串后就可以用线段树进行那一连串排序了,排序后如果p的位置上的数为0,说明答案比mid小,如果 ...

  4. [LOJ 6000]搭配飞行员

    link 其实就是一道二分图匹配板子,我们建立$S$,$T$为源点与汇点,然后分别将$S$连向所有正驾驶员,边权为$1$,然后将副驾驶员与$T$相连,边权为$1$,将数据中给出的$(a,b)$,将$a ...

  5. cmder 添加到右键菜单

    管理员权限打开cmde 输入: cmder /register all 回车,OK

  6. 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

    阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...

  7. jQuery图表插件Flot中文文档

    转载自:http://www.itivy.com/ivy/archive/2011/6/4/jquery-flot-chinese-doc.html 最近正在使用JQuery的flot进行画图,但是这 ...

  8. C++11新特性,对象移动,右值引用,移动构造函数

    C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力.接下来简要介绍一下相关概念. 右值引用 所谓右值引用就是必须绑定到右值的引用.通过 && 而不是 & 来获得右值 ...

  9. K-近邻(KNN)算法

    1,KNN算法对未知类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的点与当前点之间的距离; 按照距离递增排序; 选取与当前点距离最小的k个点; 确定前k个点所在类别的出现频率; 返 ...

  10. Moq 和 RhinoMocks

    我们在做单元测试的时候,利用mock可轻松构建出测试需要的类或接口,而不需要编写繁琐的测试代码. .net 下我知道Moq与Rhino Mocks这两个框架. Moq 网上介绍的比较多. Rhino ...