MySQL:将逐年行转换为列?

时间:2013-07-20 22:14:55

标签: mysql

我在使用MySQL select查询完成某些操作时遇到问题。我有一个统计表,包括一个字母数字ID列,一个yearID列,然后是一些不同的列,表示在指定年份发生了多少次事件。像这样:

personID  yearID  event1  event2  event3
person1     1999      12      15       2
person1     2000      14       7       3
person1     2001      25      10       2
person2     1999      16      12       1
person2     2000      15      14       1
person2     2001       9      20       2

我正在尝试使用select来获取以下列:

personID  event1_1999  event1_2000 event1_2001 event2_1999 event2_2000   etc...

所以我使用了这种类型的代码:

select
personID,
if(year_ID = "1999",event1,NULL) AS event1_1999,
if(year_ID = "2000",event1,NULL) AS event1_2000,
if(year_ID = "2000",event1,NULL) AS event1_2001,
etc.

我在结果中找到的,不幸的是,只有与第一年相对应的列(因此,在示例中,event1_1999,event2_1999等)包含任何数据,其余的都为空。我无法弄清楚为什么会这样,或者解决它的方法。有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:0)

  

...我现在看到了一种完成这项工作的技巧,但是我还没知道为什么我的技术失败。有什么见解吗?...

您必须使用汇总函数(SUM()MIN()MAX(),具体取决于您的需求)和GROUP BY

尝试

SELECT personid,
       SUM(CASE WHEN yearID = 1999 THEN event1 ELSE 0 END) event1_1999,
       SUM(CASE WHEN yearID = 2000 THEN event1 ELSE 0 END) event1_2000,
       SUM(CASE WHEN yearID = 2001 THEN event1 ELSE 0 END) event1_2001
  FROM Table1
 GROUP BY personid

同样的事情,但IF

SELECT personid,
       SUM(IF(yearID = 1999, event1, 0)) event1_1999,
       SUM(IF(yearID = 2000, event1, 0)) event1_2000,
       SUM(IF(yearID = 2001, event1, 0)) event1_2001
  FROM Table1
 GROUP BY personid

两种情况下的输出

| PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_2001 |
------------------------------------------------------
|  person1 |          12 |          14 |          25 |
|  person2 |          16 |          15 |           9 |

这是 SQLFiddle 演示

更新在数据不存在的情况下获取NULL

SELECT personid,
       SUM(CASE WHEN yearID = 1999 THEN event1 END) event1_1999,
       SUM(CASE WHEN yearID = 2000 THEN event1 END) event1_2000,
       SUM(CASE WHEN yearID = 2001 THEN event1 END) event1_2001
  FROM Table1
 GROUP BY personid;

SELECT personid,
       SUM(IF(yearID = 1999, event1, NULL)) event1_1999,
       SUM(IF(yearID = 2000, event1, NULL)) event1_2000,
       SUM(IF(yearID = 2001, event1, NULL)) event1_2001
  FROM Table1
 GROUP BY personid;

示例输出:

| PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_2001 |
------------------------------------------------------
|  person1 |          12 |          14 |          25 |
|  person2 |          16 |          15 |           9 |
|  person3 |           3 |      (null) |      (null) |

这是 SQLFiddle 演示