4

テーブル

 id | name | year

データ:

 1  | ham   | 2006
 2  | ham   | 2007
 3  | ham   | 2008
 4  | amm   | 2007
 5  | amm   | 2008
 6  | inn   | 2009

今私は私に次の出力(または同様のもの)を与えるSQLを構築しようとしています

 name  | y1   | y2   | y3   | y4    
 ham   | 2006 | 2007 | 2008 | null
 amm   | null | 2007 | 2008 | null
 inn   | null | null | null | 2009

複数の(自己)左結合を行う場合、私はこれを取得しますが、その名前に2006が設定されている場合に限ります。これを達成する方法はありますか?

4

3 に答える 3

5

「ピボット」と呼ばれるものが必要であり、必要な呼び出しは条件付きsumです。

select
   name,
   sum(year = 2006) as y1,
   sum(year = 2007) as y2,
   sum(year = 2008) as y3,
   sum(year = 2009) as y4
from mytable
group by name;

参加も、騒ぎも、大騒ぎもありません。そして、それは本当にうまくいくでしょう。

これが機能するのは、mysqlではtrueis1falseis0であるため、条件を合計すると、それがtrueであった回数がカウントされるためです。

nullこれにより、「データなし」の年のsの代わりにゼロが表示されることに注意してください。これはおそらくより良い方法です。本当にnullif(sum(year = 2006) = 0, null, sum(year = 2006)) as y1が必要な場合は、etcを使用しますが、うまくいけば、それは必要ありません。

于 2012-08-14T05:44:57.793 に答える
1

これがあなたの例(sqlfiddle)を与えられた1つの方法です:

SELECT t1.name, MAX(y1.year) AS y1, MAX(y2.year) AS y2, MAX(y3.year) AS y3, MAX(y4.year) AS y4
FROM theTable t1
LEFT OUTER JOIN theTable y1 ON t1.name = y1.name AND y1.year = 2006
LEFT OUTER JOIN theTable y2 ON t1.name = y2.name AND y2.year = 2007
LEFT OUTER JOIN theTable y3 ON t1.name = y3.name AND y3.year = 2008
LEFT OUTER JOIN theTable y4 ON t1.name = y4.name AND y4.year = 2009
GROUP BY t1.name
于 2012-08-14T05:40:38.567 に答える
0

結果の構造を気にしない場合は、次を使用できますgroup_concat

select name , group_concat(ifnull(year ,'null') separator ', ') 
              as years from table 

結果は次のように表示されます。

name  | years
ham   | 2006 , 2007 , 2008 , null
amm   | null , 2007 , 2008 , null
inn   | null , null , null , 2009
于 2012-08-14T05:45:22.437 に答える