mysql 行转列,套路版
问题:
一张表 表里有两个字段 剧场 月份
要求按照图片在控制台输出每个月每个剧场的总数 (剧场数量不限 月份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
执行结果