//---------------------------------------------------------题1 start-------------------------------------------------------------
数据表:
CREATE TABLE `t_shcool` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `userName` varchar(50) DEFAULT NULL COMMENT '姓名', `course` varchar(50) DEFAULT NULL COMMENT '科目', `score` int(20) DEFAULT NULL COMMENT '成绩', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
insert into `t_shcool` (`id`,`userName`,`course`,`score`) values (1,'张三','语文',66), (2,'张三','数学',77), (3,'张三','英文',88), (4,'李四','语文',99), (5,'李四','数学',100), (6,'李四','英文',55), (7,'王五','语文',44), (8,'王五','数学',33), (9,'马六','英文',22), (10,'马六','语文',11);
如:
查询sql:
SELECT userName AS '姓名', SUM(CASE WHEN course='语文' THEN score ELSE 0 END) AS '语文', SUM(CASE WHEN course='数学' THEN score ELSE 0 END) AS '数学', SUM(CASE WHEN course='英文' THEN score ELSE 0 END) AS '英文' FROM t_shcool GROUP BY userName
上面只能查询当前表,如果表中新增“物理”科目,则sql就无效了
//---------------------------------------------------------题1 end-------------------------------------------------------------
//---------------------------------------------------------题2 start-------------------------------------------------------------
CREATE TABLE `TabName` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(20) DEFAULT NULL, `Date` date DEFAULT NULL, `Scount` int(11) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
INSERT INTO `TabName` VALUES ('1', '小说', '2013-09-01', '10000'); INSERT INTO `TabName` VALUES ('2', '微信', '2013-09-01', '20000'); INSERT INTO `TabName` VALUES ('3', '小说', '2013-09-02', '30000'); INSERT INTO `TabName` VALUES ('4', '微信', '2013-09-02', '35000'); INSERT INTO `TabName` VALUES ('5', '小说', '2013-09-03', '31000'); INSERT INTO `TabName` VALUES ('6', '微信', '2013-09-03', '36000'); INSERT INTO `TabName` VALUES ('7', '小说', '2013-09-04', '35000'); INSERT INTO `TabName` VALUES ('8', '微信', '2013-09-04', '38000');
-- ------------------------ -- 查看数据 -- ------------------------ SELECT * from TabName ;
-- ------------------------ -- 列转行统计数据 -- ------------------------ SELECT Date , MAX(CASE NAME WHEN '小说' THEN Scount ELSE 0 END ) 小说, MAX(CASE NAME WHEN '微信' THEN Scount ELSE 0 END ) 微信 FROM TabName GROUP BY Date
-- ------------------------ -- 行转列统计数据 -- ------------------------
select Date, group_concat(NAME,'总量:',Scount) as b_str from TabName group by Date
select Date,NAME, group_concat(NAME,'总量:',Scount) as b_str from TabName group by Date ,NAME
//---------------------------------------------------------题2 end-------------------------------------------------------------
//---------------------------------------------------------题3 start-------------------------------------------------------------
CREATE TABLE `user` ( `name` varchar(50) DEFAULT NULL, `subject` varchar(50) DEFAULT NULL, `score` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user values ('zhangsan' , 'chinese' , 10), ('zhangsan' , 'math' , 20), ('zhangsan' , 'english' , 30), ('lily' , 'chinese' , 40), ('lily' , 'math' , 50), ('lily' , 'english' , 60), ('mini' , 'chinese' , 70), ('mini' , 'math' , 80), ('mini' , 'english' , 90);
case when 实现行转列
SELECT NAME, SUM( CASE SUBJECT WHEN 'chinese' THEN score ELSE 0 END) AS 'chinese', SUM( CASE SUBJECT WHEN 'math' THEN score ELSE 0 END) AS 'math', SUM( CASE SUBJECT WHEN 'english' THEN score ELSE 0 END) AS 'english' FROM USER GROUP BY NAME;
存储过程实现行转列
create procedure line_to_col() begin declare i int; declare _chinese int; declare _math int; declare _english int; declare _name varchar(10); declare test_cursor CURSOR for select name from user; select count(*) into i from user; CREATE TEMPORARY TABLE tmp_tab( name varchar(10), chinese_score int, math_socre int, english_score int); if i> 0 then open test_cursor; repeat fetch test_cursor into _name; select score into _chinese from user where subject = 'chinese' and name =_name; select score into _math from user where subject = 'math' and name =_name; select score into _english from user where subject = 'english' and name =_name; insert into tmp_tab values(_name,_chinese,_math,_english); set i=i-1; until i=0 end repeat; close test_cursor; end if; select DISTINCT * from tmp_tab; drop table tmp_tab; end
//---------------------------------------------------------题3 end-------------------------------------------------------------
相关推荐
MySQL 行转列、列转行、行列汇总、合并显示 MySQL 行转列是一种常用的数据处理操作,用于将同一列下的不同内容的几行数据转换成几列显示。例如,我们有一个成绩表 tb_score,其中包含 userid、subject 和 score 三...
MySQL 提供了两种转换数据布局的方法:行转列(Pivot)和列转行(Unpivot),这在处理复杂的数据汇总和展示时非常有用。本文将深入探讨这两种转换方法,并提供具体的 SQL 语句示例,以及创建示例表结构的 SQL 代码。...
MySQL行转列示例代码,备忘,作为需要用时的参考
### MySQL行转列与列转行详解 #### 行转列 在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个...
行转列sql实例行转列sql实例行转列sql实例行转列sql实例行转列sql实例
-- MySQL 行转列 非固定列 2009-4-25 by kim -- CREATE TABLE `expense_log` ( -- `EXPENSE_ID` INT(10) DEFAULT NULL, -- `USER_ID` VARCHAR(45) DEFAULT NULL, -- `TOTAL` INT(11) DEFAULT NULL -- ) ENGINE=...
在本篇中,我们将深入探讨如何在MySQL中解决复杂的动态行转列问题。 首先,我们要理解行转列的基本概念。在传统的SQL查询中,我们可以使用`CASE`语句配合`GROUP BY`来实现简单的行转列转换,但这种方法往往不适用于...
总之,MySQL中的行转列是数据分析过程中的一种重要技巧,尤其对于处理时间序列数据和分类统计时非常实用。通过灵活运用`CASE`和`GROUP BY`,我们可以将原始数据整理成更符合报告需求的形式,从而更好地理解业务情况...
标题“mysql-行转列、列转行”涉及到的是MySQL中的两种主要转换技巧: 1. **行转列(Pivot)**: 行转列通常用于将多行数据转换为单行的多个列。在MySQL中,没有内置的PIVOT函数,但可以通过使用`CASE`语句配合`...
### MySQL 动态行转列实现方法解析 在MySQL中,有时我们需要将数据表中的行数据转换为列数据,这种操作通常称为“行转列”或“行列转换”。本篇文章将通过一个具体的例子来详细解释如何实现MySQL动态行转列。 ####...
本文将深入探讨MySQL中的行转列算法,并通过具体的例子进行分析,以帮助读者更好地理解和掌握这一技能。 ### MySQL中的行转列算法 行转列操作通常涉及将源表中的某列的不同值转换为结果表中的不同列,同时保留其他...
MySQL 提供了一些方法来实现行转列和列转行的操作。本文将通过实例详细讲解这两种转换方式。 首先,我们来看行转列。行转列通常用于将具有多个相关值的同一列数据展示为多列。在 MySQL 中,可以使用 CASE 语句配合...
MySQL行转列操作 所谓的行转列操作,就是将一个表的行信息转化为列信息,说着可能比较笼统,这里先举个例子,如下: +----+-----------+--------+-------+ | ID | USER_NAME | COURSE | SCORE | +----+----------...
本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...
即一列中存储了多个属性值。如下表 pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末) 1.得到所有的不重复的值,如 value AT BT CT DT ET SQL...
在SQL数据库操作中,"行转列"是一种常见的数据转换需求,它将表格中的多行数据转换为单列显示,通常用于数据汇总和分析。在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在...