2013-05-01 30 views
1

我试图使用MySQL来改变修改(透视)表:透视表 - 需要包含空值作为空

WMU  YEAR  CPUE 
a  1987  22 
a  1988  32 
a  1989  2 
a  1990  34 
b  1988  5 
b  1990  4 

需要是:

WMU  CPUE_1987  CPUE_1988 CPUE_1999 CPUE_1990 
a   22   32   2    34 
b   5   null  null   4 

我曾尝试使用SELECT和JOIN声明:

select t.wmu, 
tb2.CPUE as CPUE_1987, 
tb3.CPUE as CPUE_1988, 
tb4.CPUE as CPUE_1989, 
tb5.CPUE as CPUE_1990, 
from muledeerharvest2011 as t 
JOIN muledeerharvest2011 as tb2 
JOIN muledeerharvest2011 as tb3 
JOIN muledeerharvest2011 as tb4 
JOIN muledeerharvest2011 as tb5 
WHERE tb2.year = 1987 and t.WMU = tb2.WMU 
and tb3.year = 1988 and t.WMU = tb3.WMU 
and tb4.year = 1989 and t.WMU = tb4.WMU 
and tb5.year = 1990 and t.WMU = tb5.WMU: 

这个只适用于拥有所有的“年”值“西密歇根大学”的条目。在这个例子中,诸如b的行将不会被选中。

有什么办法可以修改此语句,以便空白年份值在输出中显示为空?

在此先感谢!

回答

0

如果我得到问题正确,那么下面的查询将为您解决问题。

你没有得到和值,因为你是INNER JOIN (JOIN)LEFT JOIN将做trcik

select distinct 
t.wmu, 
tb2.CPUE as CPUE_1987, 
tb3.CPUE as CPUE_1988, 
tb4.CPUE as CPUE_1989, 
tb5.CPUE as CPUE_1990 
from muledeerharvest2011 as t 
LEFT JOIN muledeerharvest2011 tb2 
    on tb2.Year = 1987 and t.WMU = tb2.WMU 
LEFT JOIN muledeerharvest2011 tb3 
    on tb3.Year = 1988 and t.WMU = tb3.WMU 
LEFT JOIN muledeerharvest2011 tb4 
    on tb4.Year = 1989 and t.WMU = tb4.WMU 
LEFT JOIN muledeerharvest2011 tb5 
    on tb5.Year = 1990 and t.WMU = tb5.WMU 

这里是SQL Fiddle

+0

完美的作品!非常感谢你的帮助! – Rozza 2013-05-01 16:12:41

0

这也可以使用具有CASE表达式集合函数写为:

select wmu, 
    sum(case when year=1987 then cpue end) CPUE_1987, 
    sum(case when year=1988 then cpue end) CPUE_1988, 
    sum(case when year=1989 then cpue end) CPUE_1989, 
    sum(case when year=1990 then cpue end) CPUE_1990 
from muledeerharvest2011 
group by wmu; 

参见SQL Fiddle with Demo