2

我在使用 MySQL 选择查询完成某些事情时遇到了麻烦。我有一个统计表,其中包含一个字母数字 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 等)包含任何数据,其余的都是空的。我不知道为什么会这样,或者解决它的方法。任何人都可以帮忙吗?

谢谢

4

1 回答 1

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

两种情况下的输出

| 人物 | 事件1_1999 | 事件1_2000 | 事件1_2001 |
-------------------------------------------------- ----
| 人1 | 12 | 14 | 25 |
| 人2 | 16 | 15 | 9 |

这是SQLFiddle演示

UPDATENULL在缺少数据的情况下获取s

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;

样本输出:

| 人物 | 事件1_1999 | 事件1_2000 | 事件1_2001 |
-------------------------------------------------- ----
| 人1 | 12 | 14 | 25 |
| 人2 | 16 | 15 | 9 |
| 人3 | 3 | (空) | (空) |

这是SQLFiddle演示

于 2013-07-20T23:05:49.157 回答