2017-09-13 108 views
0

我想我的程序里面如下显示月份名称作为MySQL的列名

year jan  Feb ......Dec 
---- ----- -----  ----- 
2016 val1  val2  val3 
2017 val4  val5 val6 

显示年月名称作为两个日期之间的列名有一个人帮我做这件事

+0

提供一些样本表数据。 – Wanderer

+0

值是月内的天数 – HariPriya

+0

这称为* pivoting。*知道这可能会帮助您做更多的研究。可悲的是,这是MySQL脖子上的一个臭名昭着的痛苦。 –

回答

2

你可以做这样的事情,如果我理解你问题正确生成所需的结果集。 TIMESTAMPDIFF(DAY.... + INTERVAL 1 MONTH)可以计算一个月内的天数。 请注意,每个TIMESTAMPDIFF(DAY, '2016-01-01', '2016-01-01' + INTERVAL 1 MONTH) AS 'Jan'行必须正确的月份,它应该工作。

查询

SELECT 
    '2016' AS YEAR 
, TIMESTAMPDIFF(DAY, '2016-01-01', '2016-01-01' + INTERVAL 1 MONTH) AS 'Jan' 
, TIMESTAMPDIFF(DAY, '2016-02-01', '2016-02-01' + INTERVAL 1 MONTH) AS 'Feb' 
... 
, TIMESTAMPDIFF(DAY, '2016-12-01', '2016-12-01' + INTERVAL 1 MONTH) AS 'Dec' 

UNION ALL 

SELECT 
    '2017' AS YEAR 
, TIMESTAMPDIFF(DAY, '2017-01-01', '2017-01-01' + INTERVAL 1 MONTH) AS 'Jan' 
, TIMESTAMPDIFF(DAY, '2017-02-01', '2017-02-01' + INTERVAL 1 MONTH) AS 'Feb' 
... 
, TIMESTAMPDIFF(DAY, '2017-12-01', '2017-12-01' + INTERVAL 1 MONTH) AS 'Dec' 

结果

year  Jan  Feb  Dec 
------ ------ ------ -------- 
2016  31  29  31 
2017  31  28  31 

或者此查询使其eazier到新的一年,少代码重复添加。

查询

SELECT 
    years.year 
, TIMESTAMPDIFF(DAY, CONCAT(years.year, '-01-01'), CONCAT(years.year, '-01-01') + INTERVAL 1 MONTH) AS 'Jan' 
, TIMESTAMPDIFF(DAY, CONCAT(years.year, '-02-01'), CONCAT(years.year, '-02-01') + INTERVAL 1 MONTH) AS 'Feb' 
... 
, TIMESTAMPDIFF(DAY, CONCAT(years.year, '-12-01'), CONCAT(years.year, '-12-01') + INTERVAL 1 MONTH) AS 'Dec' 
FROM ( 

    SELECT 
    '2016' AS YEAR 

    UNION 
    ALL 

    SELECT 
    '2017' AS YEAR 
) 
AS years 

结果

year  Jan  Feb  Dec 
------ ------ ------ -------- 
2016  31  29  31 
2017  31  28  31