您的位置:首页 > 数据库 > MySQL

mysql 行转列,套路版

2016-07-15 11:39 423 查看
问题:

   一张表 表里有两个字段 剧场 月份 

   要求按照图片在控制台输出每个月每个剧场的总数 (剧场数量不限 月份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

执行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: