数据行转列实例

在系统开发中常常遇到进行数据的统计,并将数据行转列的情景,例如表中的表示。但是在数据库中呈现出来的数据往往是横行的样式。这就需要一个转换。转换的方式有两种方式。1.利用cross join去进行转换。2.利用case when函数去转换。

数据库查询出的结果:

张三 170
李四 90
王五 180

需要数据行转列后的结果:

张三 李四 王五
170 90 180

需求:

DEMO中就是简单的统计学生的总成绩。将统计结果进行行转列显示。

需要的表和数据:

T_STUDENTINFO表

CREATE TABLE `T_STUDENTINFO` (
`STUDENTID`  varchar(16) CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL ,
`STUDENTNAME`  varchar(32) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL ,
PRIMARY KEY (`STUDENTID`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ci
ROW_FORMAT=COMPACT
;
INSERT INTO `t_studentinfo` VALUES ('1001', '张三');
INSERT INTO `t_studentinfo` VALUES ('1002', '李四');
INSERT INTO `t_studentinfo` VALUES ('1003', '王五');

T_RESULTINFO表

CREATE TABLE `T_RESULTINFO` (
`ID`  varchar(16) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL ,
`RESULT`  varchar(32) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL ,
`STUDENTID`  varchar(16) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT NULL
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ci
ROW_FORMAT=COMPACT
;
INSERT INTO `t_resultinfo` VALUES ('1', '90', '1001');
INSERT INTO `t_resultinfo` VALUES ('2', '80', '1001');
INSERT INTO `t_resultinfo` VALUES ('3', '40', '1002');
INSERT INTO `t_resultinfo` VALUES ('4', '50', '1002');
INSERT INTO `t_resultinfo` VALUES ('5', '90', '1003');
INSERT INTO `t_resultinfo` VALUES ('6', '90', '1003');

1.利用cross join去进行转换。

利用cross join也可以实现,但是明显的要效率低一点,当增加需要统计的用户的时候需要再次增加查询语句。

select * from (
select sum(RESULT) as '张三'
from t_studentinfo t join t_resultinfo r on t.STUDENTID=r.STUDENTID and t.STUDENTNAME='张三'
) a cross join
(
select sum(RESULT) as '李四'
from t_studentinfo t join t_resultinfo r on t.STUDENTID=r.STUDENTID and t.STUDENTNAME='李四'
) b cross JOIN
(
select sum(RESULT) as '王五'
from t_studentinfo t join t_resultinfo r on t.STUDENTID=r.STUDENTID and t.STUDENTNAME='王五'
) c  

2.利用case when函数去转换。

利用case when这种方式效率更高,sql也更便于理解。

select
	sum(case when a.STUDENTNAME='张三' then b.RESULT end) as '张三',
	sum(case when studentname='李四' then result end) as '李四',
	sum(case when studentname='王五' then result end) as '王五'
from t_studentinfo a join t_resultinfo b on a.STUDENTID=b.STUDENTID;

总之,这两种方式都可以实现行转列,但是在真正的实战项目中可以需求的情况更复杂,这就需要知识的基础加上清晰的思路,其实往往数据统计都是这样的,每个知识点单独单拿出来,都会使用,但是怎么样把这些基础的东西运用到一起得到用户想要的数据,这才是我们需要考虑的问题,我觉得最主要的还是思路,找到简单的方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 04:27:22

数据行转列实例的相关文章

JSON数据行转列的应用

背景 先说说为什么要弄什么行转列. 时间 类别 费用 2014-07-08 电费 120 2014-07-08      水费 23 2014-07-09 电费 44 2014-07-09 水费 77 2014-07-10 电费 45 2014-07-10 水费 21 2014-07-11 电费 34 2014-07-11 水费 27 费劲的弄出表格,才发现,弄成了每天的水电费,不过是测试数据,不要在意这些细节. 很多时候我们就通过sql语句在数据库中查询到如上数据,那么展现到页面的时候,势必要

freemarker导出word——让表格数据行数 列数自动变化

行数.列数变化只需定义一个List<List<T>> freemarker遍历的话,只需要使用freemarker的标记性语言<#list report.qc_third_agentTable as  table2_tr>遍历即可,如图 实现的效果 freemarker导出word--让表格数据行数 列数自动变化,布布扣,bubuko.com

数据行转列的应用(json数据源)

开发项目时有时会遇到将数据的行列进行转换.今天逛园子是看到一个很不错的方法.不需要在数据库中对数据进行行列转换,将数据集合转换长json格式使用如下代码即可. <script> $(document).ready(function () { var jsonData = [ { time: '2014-07-08', name: '电费', value: 120 }, { time: '2014-07-09', name: '电费', value: 66 }, { time: '2014-07

Sql server 中将数据行转列列转行(二)

老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName nvarchar(20), --学生名称 Chinese int, Math int, English int ) DROP TABLE #Student --删除临时表 SELECT * FROM #Student --查询所有数据 INSERT INTO #Student(StuName,Chinese,Math

Mysql或者Hive数据行变成列

对于mysql /  hive 再进行统计的时候如果需要行变成列,可以使用函数 CASE 字段a WHEN 值b THEN c [WHEN d THEN e]* [ELSE f] END 当字段a=值b时,返回c(如果是字段的话则代表该字段的值,也可以是一个固定值 加单引号就可以):当a=d时,返回e,否则返回f. 如: 数据表结构:(举例说明,id有重复的) select id ,sum(CASE action when 'article' then count else 0 end) as

Sql server 中将数据行转列列转行(一)

在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName nvarchar(20), --学生名称 StuSubject nvarchar(20),--考试科目 StuScore int --考试成绩 ) DROP TABLE #Student --删除临时表 SELECT * FROM #Student

Oracle数据 行转列

记录一段行转列SQL代码: select cs.standard_id,cs.area_code,cs.exu_dept, regexp_substr(exu_dept, '[^,]+', 1, level) as dept_id from ca_stand_exu_dept cs connect by id = prior id and instr(exu_dept||',', ',', 1, level) > 0 and prior dbms_random.value is not null

R语言数据框行转列实例

目的:须要把数据框的行列进行转置 方法: # 原始数据框 > hrl_jd_mon 年份 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 1 2010年 51.2 45.8 55.8 62.9 63.8 59.5 80.5 78.0 66.0 92.3  50.80   55.6 2 2011年 54.8 54.4 64.1 78.5 64.5 63.4 95.3 89.2 68.8 86.1  51.40   52.4 3 2012年 53.0 46.1 52.8

C#读txt文件并写入二维数组中(txt数据行,列未知)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace 二维数组 { class Program { static void Main(string[] args) { int row = 0;//行 int col = 0;//lie FileStream fs; string path = @"C:\Documents an