Отключить таблицу и присоединиться при условии SQL - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть 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

и затем присоединитесь к медалям, приведя только количество столбцов медалей за 2002, 2006, 2010 и 2104 годы, потому что у нас есть только значения за эти годы в фондах. На последнем этапе я делю значение / countofmedal на значение / медаль.

Финальная таблица должна выглядеть следующим образом:

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

1 Ответ

0 голосов
/ 22 февраля 2020
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;
...