dongwei6457 2014-08-23 12:26
浏览 110
已采纳

从数据库中选择数据并在MYSQL中创建新列

I have a Table with three columns: countrycode, year and values. Year consists of a number of years ( 2000, 2001 and 2002) . I need to select data for a particular year and display it as a new column.

    SELECT g.countrycode, g.values AS '2000'
      FROM `gainfinal` g 
     WHERE `year` = '2000' 

I used the query above which returned two columns year and 2000, with column '2000' containing the values for year 2000. Now I need to select data from other year 2001 and 2002 and display it in the similar ways. How can I create two more columns for two more years.

  • 写回答

1条回答 默认 最新

  • dousou1878 2014-08-23 12:33
    关注

    You would use conditional aggregation. Combine aggregate functions with CASE statements.

    Here is an example for summing up your values for years between 2000 and 2003.

    SELECT  g.countrycode,
            sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
            sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
            sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
            sum(case when `year` = '2003' then g.values else 0 end) AS "2003"
    FROM    `gainfinal` g
    WHERE   `year` between '2000' and '2003'
    group by g.countrycode
    

    Your sample data does not contain any rows where the year is 2002 or 2003. So they should be zeros.

    If you want data for 2004, you have to add 2004 to the range in the WHERE clause, and add a CASE statement for it to the SELECT list, like below.

    However 2002 and 2003 will still be all zeros, because they are zeros.

    SELECT  g.countrycode,
            sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
            sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
            sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
            sum(case when `year` = '2003' then g.values else 0 end) AS "2003",
            sum(case when `year` = '2004' then g.values else 0 end) AS "2004"
    FROM    `gainfinal` g
    WHERE   `year` between '2000' and '2004'
    group by g.countrycode
    

    You do have to specify the range of years, and have one case statement in the select list for every year that you want output for. There is no purely sql solution for the columns to be dynamically determined. For that you would probably be better served just making a pivot table in Excel. The above assumes that you know what years you want to show data for ahead of time.

    So if you wanted 1995 to 2012, you would have to have a CASE statement for every year, like so:

    SELECT  g.countrycode,
            sum(case when `year` = '1995' then g.values else 0 end) AS "1995",
            sum(case when `year` = '1996' then g.values else 0 end) AS "1996",
            sum(case when `year` = '1997' then g.values else 0 end) AS "1997",
            sum(case when `year` = '1998' then g.values else 0 end) AS "1998",
            sum(case when `year` = '1999' then g.values else 0 end) AS "1999",
            sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
            sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
            sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
            sum(case when `year` = '2003' then g.values else 0 end) AS "2003",
            sum(case when `year` = '2005' then g.values else 0 end) AS "2004",
            sum(case when `year` = '2006' then g.values else 0 end) AS "2005",
            sum(case when `year` = '2007' then g.values else 0 end) AS "2006",
            sum(case when `year` = '2008' then g.values else 0 end) AS "2007",
            sum(case when `year` = '2009' then g.values else 0 end) AS "2008",
            sum(case when `year` = '2010' then g.values else 0 end) AS "2009",
            sum(case when `year` = '2011' then g.values else 0 end) AS "2010",
            sum(case when `year` = '2012' then g.values else 0 end) AS "2011",
            sum(case when `year` = '2012' then g.values else 0 end) AS "2012"
    FROM    `gainfinal` g
    WHERE   `year` between '1995' and '2012'
    group by g.countrycode
    

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试