我有2张桌子:
资金
country 2002 2006 2010 2014
Chicago 1000 23000 4500 9076
勋章
year sport event country gender medal_rank medal
2006 A Z Chicago F 2 silver
1924 B ZZ Newyork M 3 bronze
2014 C ZZZZ Chicago M 1 Gold
1967 B ZZb Newyork M 3 bronze
2014 C ZZa Chicago F 2 silver
我想取消像这样的基金中的数据
country year value
Chicago 2002 1000
Chicago 2006 23000
Chicago 2010 4500
Chicago 2014 9076
然后与Medals一起加入,仅将2002、2006、2010和2104年的奖牌栏计数,因为我们在Funds中仅具有那几年的价值。在最后一步中,我将价值/奖章数除以价值/奖章。
最终表应如下所示:
country year value countofmedeals value/medal
Chicago 2002 1000 0 0
Chicago 2006 23000 1 23000
Chicago 2010 4500 0 0
Chicago 2014 9076 2 4536
下面是我尝试的代码,但是它不起作用。
use RDG
select
S.Yr,
qu.year,
s.Cost,
count(qu.medal)
from
(
select
country,
yr,
Cost
from Funds
unpivot
(
Yr for Cost in ([2002],[2006],[2010],[2014])
) as u
) s
join medals qu
on (s.country=qu.country and s.Yr=qu.year)
group by s.Yr,qu.year,s.Cost
declare @Funds table
(
country varchar(20),
[2002] int,
[2006] int,
[2010] int,
[2014] int
);
insert into @Funds(country, [2002], [2006], [2010], [2014])
values ('Chicago', 1000, 23000, 4500, 9076);
declare @Medals table
(
year int,
sport varchar(20),
event varchar(20),
country varchar(20),
gender char(1),
medal_rank tinyint,
medal varchar(20)
);
insert into @Medals(year, sport, event, country, gender, medal_rank, medal)
values
(2006, 'A', 'Z', 'Chicago', 'F', 2, 'silver'),
(1924, 'B', 'ZZ', 'Newyork', 'M', 3, 'bronze'),
(2014, 'C', 'ZZZZ', 'Chicago', 'M', 1, 'Gold'),
(1967, 'B', 'ZZb', 'Newyork', 'M', 3, 'bronze'),
(2014, 'C', 'ZZa', 'Chicago', 'F', 2, 'silver');
select
S.country,
S.Yr,
qu.year /*??*/,
s.value,
count(qu.medal) as countofmedals,
cast(isnull(s.value*1./nullif(count(qu.medal), 0), 0) as decimal(19,2)) as [value/medal]
from
(
select
country,
yr,
value
from @Funds
unpivot
(
value for yr in ([2002],[2006],[2010],[2014]) --!!!!
) as u
) s
left join @medals qu --!!!!
on (s.country=qu.country and s.Yr=qu.year)
group by s.country, s.Yr,qu.year/*??*/,s.value;