使用group加入mysql on self

Ham*_*olf 4 mysql pivot

 id | name | year
Run Code Online (Sandbox Code Playgroud)

数据:

 1  | ham   | 2006
 2  | ham   | 2007
 3  | ham   | 2008
 4  | amm   | 2007
 5  | amm   | 2008
 6  | inn   | 2009
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试构建一个sql,它给我以下输出(或类似)

 name  | y1   | y2   | y3   | y4    
 ham   | 2006 | 2007 | 2008 | null
 amm   | null | 2007 | 2008 | null
 inn   | null | null | null | 2009
Run Code Online (Sandbox Code Playgroud)

当进行多个(自我)左连接时,我得到了这个,但只有在为该名称设置2006时.有没有办法实现这个目标?

Boh*_*ian 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;
Run Code Online (Sandbox Code Playgroud)

没有加入,没有muss,没有大惊小怪.它会表现得非常好.

这是有效的,因为在mysql中,true1false0,所以总结一个条件计算它是多少次真实!

请注意,null对于"无数据"年,这将为您提供零而不是s,这可能更好.如果你真的想要空值,请使用if(sum(year = 2006) = 0, null, sum(year = 2006)) as y1等,但希望你不需要它.