MySQL显示今年的价值和去年同一张表

时间:2013-11-29 19:01:27

标签: mysql

我对mysql很新,但我有一个看起来像这样的表:

+----+------+-------+-------+------+
| id | year | month | total | cost |
+----+------+-------+-------+------+
|  1 | 2011 | Dec   |  2000 | 2048 |
|  2 | 2012 | Jan   |  2675 | 2738 |
|  3 | 2012 | Feb   |  2685 | 2749 |
|  4 | 2012 | Mar   |  1787 | 1830 |
|  5 | 2012 | Apr   |  1547 | 1584 |
|  6 | 2012 | May   |   847 |  867 |
|  7 | 2012 | Jun   |   621 |  636 |
|  8 | 2012 | Jul   |   610 |  624 |
|  9 | 2012 | Aug   |   659 |  675 |
| 10 | 2012 | Sep   |   828 |  848 |
| 11 | 2012 | Oct   |  1420 | 1454 |
| 12 | 2012 | Nov   |  1608 | 1646 |
| 13 | 2012 | Dec   |  2721 | 2786 |
| 14 | 2013 | Jan   |  2636 | 2699 |
| 15 | 2013 | Feb   |  2266 | 2320 |
| 16 | 2013 | Mar   |  2351 | 2407 |
| 17 | 2013 | Apr   |  1497 | 1532 |
| 18 | 2013 | May   |   819 |  838 |
| 19 | 2013 | Jun   |   668 |  684 |
| 20 | 2013 | Jul   |   580 |  594 |
| 21 | 2013 | Aug   |   623 |  638 |
| 22 | 2013 | Sep   |   790 |  808 |
| 23 | 2013 | Oct   |  1146 | 1173 |
| 24 | 2013 | Nov   |  1581 | 1618 |
+----+------+-------+-------+------+

我需要一个查询,它会给我结果(成本):

+-------+-------+------+
| month |  2012 | 2013 |
+-------+-------+------+
| Sep   |   848 |  808 |
| Oct   |  1454 | 1173 |
| Nov   |  1646 | 1618 |
+-------+-------+------+

我正在关注电力消耗,需要查看今年和去年的月份。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

select month, 
       sum(case when year = 2012 then cost else 0 end) as 2012,
       sum(case when year = 2013 then cost else 0 end) as 2013
from your_table
where month in ('Sep','Oct','Nov') and year in (2012,2013)
group by month

答案 1 :(得分:1)

虽然我没有编写过查询来生成您正在寻找的结果,但在对您的问题进行一些研究后,我发现了这里可能的解决方案:

http://forums.mysql.com/read.php?20,75357,75357#msg-75357

请参考有人在创建可能产生您需要的结果的视图中使用MAX()函数的回复。

由于这会为您创建一个视图,您不需要每次都重新运行查询,而只需查看视图的内容,甚至可以对视图运行查询!

以下是基于上述链接中提供的答案,我根据您的需求制定了该问题,请对此进行测试并将YOUR_TABLE_NAME替换为您的表名。

CREATE VIEW monthly_info_view AS
    SELECT  month,
            MAX( IF(year=2011,value,'') ) AS '2011',
            MAX( IF(year=2012,value,'') ) AS '2012',
            MAX( IF(year=2013,value,'') ) AS '2013'
    FROM YOUR_TABLE_NAME
    GROUP BY month

这不太好的原因是您每年都必须修改此视图以添加新年的相应列。