mysql 行转列,套路版
2016-07-15 11:39
423 查看
问题:
一张表 表里有两个字段 剧场 月份
要求按照图片在控制台输出每个月每个剧场的总数 (剧场数量不限 月份1——12月)
剧场是剧场名称,月份存的是演出的时间yyyy-MM-dd hh:mm:ss
分析了下,这个问题,主要有2个点,解决了这2个点,就能解决问题
第一个点:时间搓-->月份。
这个不难,写个方法就可以了。
第二个点:行转列
这个也比较常见。
于是,就开始解题了
1.表中数据
2.行转列
满怀欢喜的运行,然而,结果并不如人意。
很明显,7月的“上海大舞台”应该是2,才对,但是,查询出来却是1!
想了下,原来我在select 月份中,写的有问题,这个地方必须是动态的值
在select中计算肯定是不行的,必须得嵌套一个子查询了
修改后,如下
select
ttt.tname,
max(if(ttt.ttime = '1月',ttt.total,0)) as '1月',
max(if(ttt.ttime = '2月',ttt.total,0)) as '2月',
max(if(ttt.ttime = '3月',ttt.total,0)) as '3月',
max(if(ttt.ttime = '4月',ttt.total,0)) as '4月',
max(if(ttt.ttime = '5月',ttt.total,0)) as '5月',
max(if(ttt.ttime = '6月',ttt.total,0)) as '6月',
max(if(ttt.ttime = '7月',ttt.total,0)) as '7月',
max(if(ttt.ttime = '8月',ttt.total,0)) as '8月',
max(if(ttt.ttime = '9月',ttt.total,0)) as '9月',
max(if(ttt.ttime = '10月',ttt.total,0)) as '10月',
max(if(ttt.ttime = '11月',ttt.total,0)) as '11月',
max(if(ttt.ttime = '12月',ttt.total,0)) as '12月'
FROM
(
SELECT
tt.tname,
tt.ttime,
count(1) AS 'total'
FROM
(
SELECT
tname AS tname,
checkMonth (ttime) AS ttime
FROM
`theatre` th
) tt
GROUP BY
tt.tname,
tt.ttime
) ttt
GROUP BY
ttt.tname
执行结果
一张表 表里有两个字段 剧场 月份
要求按照图片在控制台输出每个月每个剧场的总数 (剧场数量不限 月份1——12月)
剧场是剧场名称,月份存的是演出的时间yyyy-MM-dd hh:mm:ss
分析了下,这个问题,主要有2个点,解决了这2个点,就能解决问题
第一个点:时间搓-->月份。
这个不难,写个方法就可以了。
第二个点:行转列
这个也比较常见。
于是,就开始解题了
1.表中数据
2.行转列
SELECT t.tname, MAX(IF(t.ttime = '1月', 1, 0)) AS '1月', MAX(IF(t.ttime = '2月', 1, 0)) AS '2月', MAX(IF(t.ttime = '3月', 1, 0)) AS '3月', MAX(IF(t.ttime = '4月', 1, 0)) AS '4月', MAX(IF(t.ttime = '5月', 1, 0)) AS '5月', MAX(IF(t.ttime = '6月', 1, 0)) AS '6月', MAX(IF(t.ttime = '7月', 1, 0)) AS '7月', MAX(IF(t.ttime = '8月', 1, 0)) AS '8月', MAX(IF(t.ttime = '9月', 1, 0)) AS '9月', MAX(IF(t.ttime = '10月', 1, 0)) AS '10月', MAX(IF(t.ttime = '11月', 1, 0)) AS '11月', MAX(IF(t.ttime = '12月', 1, 0)) AS '12月' FROM ( SELECT tname AS tname, checkMonth (ttime) AS ttime FROM `theatre` th ) t GROUP BY t.tname;
满怀欢喜的运行,然而,结果并不如人意。
很明显,7月的“上海大舞台”应该是2,才对,但是,查询出来却是1!
想了下,原来我在select 月份中,写的有问题,这个地方必须是动态的值
在select中计算肯定是不行的,必须得嵌套一个子查询了
修改后,如下
select
ttt.tname,
max(if(ttt.ttime = '1月',ttt.total,0)) as '1月',
max(if(ttt.ttime = '2月',ttt.total,0)) as '2月',
max(if(ttt.ttime = '3月',ttt.total,0)) as '3月',
max(if(ttt.ttime = '4月',ttt.total,0)) as '4月',
max(if(ttt.ttime = '5月',ttt.total,0)) as '5月',
max(if(ttt.ttime = '6月',ttt.total,0)) as '6月',
max(if(ttt.ttime = '7月',ttt.total,0)) as '7月',
max(if(ttt.ttime = '8月',ttt.total,0)) as '8月',
max(if(ttt.ttime = '9月',ttt.total,0)) as '9月',
max(if(ttt.ttime = '10月',ttt.total,0)) as '10月',
max(if(ttt.ttime = '11月',ttt.total,0)) as '11月',
max(if(ttt.ttime = '12月',ttt.total,0)) as '12月'
FROM
(
SELECT
tt.tname,
tt.ttime,
count(1) AS 'total'
FROM
(
SELECT
tname AS tname,
checkMonth (ttime) AS ttime
FROM
`theatre` th
) tt
GROUP BY
tt.tname,
tt.ttime
) ttt
GROUP BY
ttt.tname
执行结果
相关文章推荐
- Mysql中新建用户及授权的方法分享
- Mac 修改MYSQL 的默认编码格式 解决中文插入MySql里乱码
- 浅谈 MySQL 的存储引擎(表类型)
- Mysql新建用户和数据库并授权
- pypy的virtualenv安装mysql的问题解决
- mysql如何在一个表中插入数据的同时,更新另一个表的数据?
- 修改MySQL用户的权限
- 安装MySQL示例数据库sakila
- MySQL添加数据库的唯一索引的几种方式~
- MySQL数据库迁移data文件夹位置
- 如何导出和导入mysql数据(数据迁移)
- 获取mysql表插入数据自增字段的值
- Win7_64位使用Mysql Odbc
- MYSQL搜索引擎
- MySQL压缩版安装配置遇到的问题及解决办法
- mysql 查看binlog日志
- mysql的备份
- MYSQL学习笔记
- SSM连接数据库Mysql的配置
- 【旧代码整理】一个PHP操作mysql的class类