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 など) のみにデータが含まれており、残りはすべて null であるということです。これがなぜなのか、またはそれを回避する方法がわかりません。誰でも助けることができますか?

ありがとう

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

どちらの場合も出力

| | PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_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;

出力例:

| | PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_2001 |
-------------------------------------------------- ----
| | 人1 | 12 | 14 | 25 |
| | 人2 | 16 | 15 | 9 |
| | 人3 | 3 | (ヌル) | (ヌル) |

これがSQLFiddleのデモです

于 2013-07-20T23:05:49.157 に答える