【转】Mysql行转换为列
From : http://www.cnblogs.com/lhj588/archive/2012/06/15/2550392.html#
今晚需要统计数据生成简易报表,由原表格数据是单行的形式,最好转换为列表格式,由网上介绍方法实现如下:
希望获得的最终效果见下:
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
| 房间 | 房租 | 水费 | 电费 | 卫生费 | 电视费 | 网络费 | 记录时间 | total |
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
| 0201 | 400 | 0 | 0 | 10 | 0 | 0 | 2011-02-08 11:01:21 | 410 |
| 0204 | 150 | 0 | 0 | 10 | 0 | 0 | 2011-02-08 11:00:21 | 160 |
| 0206 | 150 | 0 | 0 | 10 | 0 | 0 | 2011-01-16 18:02:50 | 160 |
| 0302 | 350 | 40.92 | 18.91 | 20 | 50 | 50 | 2011-01-18 01:45:23 | 529.83 |
| 0306 | 150 | 0 | 0 | 10 | 0 | 0 | 2011-02-08 11:23:15 | 160 |
| 0308 | 200 | 0 | 0 | 10 | 0 | 0 | 2011-03-28 22:26:41 | 210 |
| total | 1400 | 40.92 | 18.91 | 70 | 50 | 50 | 2011-03-28 22:26:41 | 1629.83 |
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
实现的SQL语句见下:
mysql> SELECT
-> IFNULL(RoomNo,'total') AS 房间,
-> SUM(IF(FeeName='房租',FeeMoney,0)) AS 房租,
-> SUM(IF(FeeName='水费',FeeMoney,0)) AS 水费,
-> SUM(IF(FeeName='电费',FeeMoney,0)) AS 电费,
-> SUM(IF(FeeName='卫生费',FeeMoney,0)) AS 卫生费,
-> SUM(IF(FeeName='电视费',FeeMoney,0)) AS 电视费,
-> SUM(IF(FeeName='网络费',FeeMoney,0)) AS 网络费,
-> IFNULL(CDate, CDate) AS 记录时间,
-> SUM(IF(FeeName='total',FeeMoney,0)) AS total
-> FROM (
-> select no.RoomNo as RoomNo, IFNULL(f.FeeName, 'total') as FeeName, SUM(f.FeeMoney) as FeeMoney, f.CreateDate as CDate
-> from roomnoinfo no, Fee f
-> where no.bid=1 and no.beempty='full' and no.RoomNo=f.RoomNo and
-> f.CreateDate < '2011-03-31' and f.CreateDate >'2011-01-01'
-> GROUP BY RoomNO, FeeName
-> WITH ROLLUP
-> HAVING RoomNO IS NOT NULL
-> ) AS A
-> GROUP BY RoomNo
-> WITH ROLLUP;
源数据的表格式如下:
mysql> select RoomNo, CreateDate, FeeName, FeeMoney from Fee where bid=1;
+--------+---------------------+---------+----------+
| RoomNo | CreateDate | FeeName | FeeMoney |
+--------+---------------------+---------+----------+
| 0101 | 2011-01-15 22:41:24 | 房租 | 200 |
| 0101 | 2011-01-15 22:41:24 | 水费 | 13.2 |
| 0101 | 2011-01-15 22:41:24 | 电费 | 6.1 |
| 0102 | 2011-01-16 17:01:52 | 房租 | 150 |
| 0102 | 2011-01-16 17:01:52 | 水费 | 145.2 |
| 0102 | 2011-01-16 17:01:52 | 电费 | 67.1 |
| 0102 | 2011-01-16 17:01:52 | 卫生费 | 10 |
| 0204 | 2011-02-08 11:00:21 | 房租 | 150 |
| 0204 | 2011-02-08 11:00:21 | 水费 | NULL |
| 0204 | 2011-02-08 11:00:21 | 电费 | NULL |
| 0204 | 2011-02-08 11:00:21 | 卫生费 | 10 |
| 0206 | 2011-01-16 18:02:50 | 房租 | 150 |
| 0206 | 2011-01-16 18:02:50 | 水费 | NULL |
| 0206 | 2011-01-16 18:02:50 | 电费 | NULL |
| 0206 | 2011-01-16 18:02:50 | 卫生费 | 10 |
| 0302 | 2011-01-18 01:42:35 | 房租 | 150 |
| 0302 | 2011-01-18 01:42:35 | 水费 | 40.92 |
| 0302 | 2011-01-18 01:42:35 | 电费 | 18.91 |
| 0302 | 2011-01-18 01:42:35 | 卫生费 | 10 |
| 0302 | 2011-01-18 01:45:23 | 卫生费 | 10 |
| 0302 | 2011-01-18 01:45:23 | 房租 | 200 |
| 0302 | 2011-01-18 01:45:23 | 网络费 | 50 |
| 0302 | 2011-01-18 01:45:23 | 电视费 | 50 |
| 0306 | 2011-02-08 11:23:15 | 房租 | 150 |
| 0306 | 2011-02-08 11:23:15 | 水费 | NULL |
| 0306 | 2011-02-08 11:23:15 | 电费 | NULL |
| 0306 | 2011-02-08 11:23:15 | 卫生费 | 10 |
| 0308 | 2011-03-28 22:26:41 | 房租 | 200 |
| 0308 | 2011-03-28 22:26:41 | 水费 | NULL |
| 0308 | 2011-03-28 22:26:41 | 电费 | NULL |
| 0308 | 2011-03-28 22:26:41 | 卫生费 | 10 |
+--------+---------------------+---------+----------+
31 rows in set (0.02 sec)
原文介绍地址 http://blogold.chinaunix.net/u3/90603/showart_2017912.html
|
【转】Mysql行转换为列的更多相关文章
- MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用
在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...
- excel中怎么将行转换为列及列转换成行
操作方法 01 选中要把行转换为列的数据.然后点击键盘上的ctrl+c. 02 在需要放置的单元格上,右键点击,然后点击菜单上的‘选择性粘贴’. 03 在弹出的窗口上,点击勾选上‘转置’.点击确定按钮 ...
- MySQL 行转列 -》动态行转列 -》动态行转列带计算
Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql ...
- MySql 行转列 存储过程实现
同学们在使用mysql的过程中,会遇到一个行转列的问题,就是把多条数据转化成一条数据 用多列显示. 方法1. 实现方式用下面的存储过程,表名对应的修改就行. BEGIN declare current ...
- mysql行转列,函数GROUP_CONCAT(expr)
demo: 语句: SELECT '行' id, '' product_nameUNIONSELECT id, product_name FROM `product` WHERE id < 5 ...
- mysql行转列 问题 SUM(IF(条件,列值,0))
sum(if(条件,列值,0))语法用例: select name,sum(if(subject="语文",score,0)) as "语文" from gra ...
- mysql行转列、列转行示例
最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示. 借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用. ...
- MySQL行转列、列转行
一.行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCRE ...
- mysql 行转列 列转行
一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id ) ...
随机推荐
- mysql xtrabackup工具备份
一.注意事项 建议用xtrabackup备份时采用全备或增量备份的方式,楼主也尝试过单库备份,但是都以备份后恢复到已经存在数据库的mysqldata目录下后部分库会出幺蛾子而告终,建议使用mysqld ...
- Gitlab Webhooks, External Services, and API(二)
一. 使用webhooks webhook 是一个API的概念,并且变得越来越流行.我们能用事件描述的事物越多,webhook的作用范围也就越大.webhook作为 个轻量的事件处理应用,正变得越来越 ...
- SpringBoot的Controller使用
一: 1.注解 2.control注解 3.效果 4.RespomseBody package com.caojun.springboot; import org.springframework.be ...
- 接口调试工具ApiPost的发送超时时间设置方法
有部分使用ApiPost的同学反应:发送接口调试时,响应超时时间设置的太短导致接口访问失败,怎么设置呢? 就连百度也有很多人在搜: 今天就来说一说. ApiPost简介: ApiPost是一个支持团队 ...
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- OSI 7层 TCP/IP 4层
在网络层有{ IP协议:IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求. ICMP协议:I ...
- Codeforces.862D.Mahmoud and Ehab and the binary string(交互 二分)
题目链接 \(Description\) 有一个长为\(n\)的二进制串,保证\(01\)都存在.你可以询问不超过\(15\)次,每次询问你给出一个长为\(n\)的二进制串,交互库会返回你的串和目标串 ...
- [CQOI2007]涂色
[CQOI2007]涂色 题目大意: 假设你有一条长度为\(n\)的木版,初始时没有涂过任何颜色.每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色.问达到给定的目标至少要多少次操 ...
- Codeforces Round #272 (Div. 2) E. Dreamoon and Strings 动态规划
E. Dreamoon and Strings 题目连接: http://www.codeforces.com/contest/476/problem/E Description Dreamoon h ...
- 使用WSL连接Docker Server(Windows/Linux)
在Windows下安装Docker for Windows Cotana搜索功能,打开Windows的Hype-v功能(注:会影响Virtualbox和Vmware的使用)并重启电脑. 从Docker ...