我在使用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等)包含任何数据,其余的都为空。我无法弄清楚为什么会这样,或者解决它的方法。有人可以帮忙吗?
由于
答案 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 演示