mysql 分数表 行数据转成列数据 行列转换
程序员文章站
2024-03-18 20:50:46
...
今天,在群里遇到有人问关于分数表行列转换的问题。我找小兄弟拿到了数据,写了sql 做了演示。
mysql 数据库 中,我们大部分查询是基于行的,查询一行或者几行数据,取出来。但是,有时候有些标的数据设计 是把列数据变成了行数据存储,这时候我们在查询数据的时候就需要把行数据转成列数据来展示。
这就是行列的转换,一般情况下很少遇到,不过遇到了之后,对mysql不是太熟了的同学可能有些棘手。今天,我就根据这个同学的实际生产中的例子,来演示下mysql下列 转成行的操作。
前提摘要:常见行列表设计,考试分数表
一般性设计:
考生 | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 90 | 80 | 60 |
我们一般是这么设计成绩表,但是有些时候,有的小伙伴会采用另外一种方式存储数据,
设计如下:
考生 | 科目类型 | 分数 |
---|---|---|
张三 | 语文 | 90 |
张三 | 数学 | 80 |
张三 | 数学 | 70 |
这种模式,逻辑上类似链表。但是在需要展示学生成绩的时候,不好展示,需要做行列变化。
有些朋友一般会在程序里通过代码做转换,但实际上,我们可以直接通过sql语句做转换。
下面是我今天给打架的例子:(例子来源于问问题的小伙伴提供)
表数据:百度网盘下载
提取码:xmp6
SQL:
SELECT kaohao_id,
SUM(CASE `subject_id` WHEN 1 THEN defen ELSE 0 END) AS 'k1',
SUM(CASE `subject_id` WHEN 2 THEN defen ELSE 0 END) AS 'k2',
SUM(CASE `subject_id` WHEN 3 THEN defen ELSE 0 END) AS 'k3'
FROM cj_chengji
GROUP BY kaohao_id
我们通过 这种方式就可以把行数据转成列数据,
原理的话,请自行查看Mysql手册啦,这个我就不多说了。
上一篇: HDU2004 成绩转换【入门】
下一篇: JavaScript进制之间的转换