MySQL数据库行转换为列的2种方法
来源:互联网 发布:淘宝花呗分期扣全款 编辑:程序博客网 时间:2024/06/06 09:41
写在前面的话:
本博客只是为了记录我在工作中遇到的一些bug,以便日后重蹈覆辙,目前我还是一名在校大四学生,在公司实习不足半年,可能记录的问题会非常简单和出现一些错误,希望各位浏览的大神一笑而过,不吝指教,文明看帖,拒绝喷子,谢谢!
言归正传,今天在公司做个人工资结算查询的时候,需要从数据库取值(数据库为MySQL),显示为类似工资条的效果,但是数据库的表结构需要进行行转换为列,数据库表结构如下:
处理前:
处理后:
首先,贴出我要转换的表的SQL语句,这是一个多表联查,行转换为列有点复杂,后面我会写一个单表的转换语句,以便理解。
SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id
第一种方法:
SELECT a.true_name, MAX( CASE a.meta_name WHEN '底薪' THEN a.amount ELSE 0 END ) 底薪, MAX( CASE a.meta_name WHEN '绩效奖金' THEN a.amount ELSE 0 END ) 绩效奖金, MAX( CASE a.meta_name WHEN '工龄工资' THEN a.amount ELSE 0 END ) 工龄工资, MAX( CASE a.meta_name WHEN '全勤' THEN a.amount ELSE 0 END ) 全勤 FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as aGROUP BY a.true_name;
因为查询的是工资,所以需要加一个else 0,当数据库值为null时,显示为0。
第二种方法:
SELECT DISTINCT a.true_name, (SELECT amount FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as b WHERE a.true_name=b.true_name AND b.meta_name='底薪' ) AS '底薪',(SELECT amount FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as b WHERE a.true_name=b.true_name AND b.meta_name='绩效奖金' ) AS '绩效奖金',(SELECT amount FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as b WHERE a.true_name=b.true_name AND b.meta_name='工龄工资' ) AS '工龄工资',(SELECT amount FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as b WHERE a.true_name=b.true_name AND b.meta_name='全勤' ) AS '全勤' FROM (SELECT u.id,u.true_name, m.meta_name, c.amount from metadata m INNER JOIN charge c on c.charge_type=m.id INNER JOIN user u on c.user_id=u.id) as a
这个方法稍微复杂了一点,需要注意的是,这里用到了嵌套子查询,而且将一个子查询进行了不同的重命名,重复使用。
最后,为第二个方法写一个单表的示例,便于理解和使用
SELECT DISTINCT a.sname, (SELECT score FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='JAVA' ) AS 'JAVA', (SELECT score FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='mysql' ) AS 'mysql' FROM stdscore a
1 0
- MySQL数据库行转换为列的2种方法
- 数据库列转换为行
- Mysql行转换为列
- mysqlDataReader转换为DataTable类型,mysql数据库的访问方法
- mysql将日期转换为星期的三种方法
- MySQL转换为SqlServer数据库
- mysql数据库转换为Access
- mysql数据库转换为utf8
- oracle列转换为行
- oracle列转换为行
- mysql数据库下行列转换笔记
- phpmyadmin导出mysql查询的数据为excel分号格式转换为列
- python将mysql数据库的数据转换为json数据
- 把以',' 分隔的列转换为行,读取出来
- 行转列,多列的数据合并为一行,行转换
- MySQL数据库编码转换方法
- [VB.NET]急!!!! 实现矩阵转置,即将矩阵的行,列互换,一个3行2列的矩阵将转换为2行3列.
- mysql查询结果转换为PHP数组的几种方法的区别
- ServletContext,ActionContext,ServletActionContext 的区别
- Android Canvas绘图详解【转】
- [bzoj1015][JSOI2008]星球大战starwar
- python数据分析scipy简单例子
- Android onTouch()和onTouchEvent()区别
- MySQL数据库行转换为列的2种方法
- intellij idea 2016.3.4破解方法
- SDIO接口介绍
- RabbitMQ 添加用户
- jsp如何引号引号的运用
- Android设置textview只有一边有边框
- svn: OPTIONS of '/svn/repos': 403 Forbidden
- java中substring()和oracle中substr()区别
- leetcode 103. Binary Tree Zigzag Level Order Traversal