Еще один сводный запрос SQL Server - PullRequest
1 голос
/ 23 июня 2011

Я, к сожалению, не могу разобраться с предыдущими примерами.

Я пытаюсь создать таблицу, основанную на результатах голосования за MVP за бейсбольные мячи и сравнивающую ее с более объективной мерой WAR, которая теперь доступна.Я хочу видеть разницу между двумя лучшими игроками в соответствии с этим значением.Вот код, показывающий всего пару лет из множества

select season,division,player,rankMVP as MVP,WAR,rankWAR 
 from mlbmvpvoting
where   (season = '1955' or season = '1956')
and rankWAR < 3
order by season,division,rankWAR

season division   player                   MVP  WAR  rankWAR
1955    AL  Mickey Mantle                   5   9.5     1
1955    AL  Al Kaline                       2   9.0     2
1955    NL  Willie Mays                     4   9.3     1
1955    NL  Duke Snider                     2   8.9     2
1956    AL  Mickey Mantle                   1   12.9    1
1956    AL  Early Wynn                      13  8.5     2
1956    NL  Duke Snider                     10  7.7     1
1956    NL  Hank Aaron                      3   7.5     2

Я хочу создать что-то вроде этого

season   division  pl_1         pl_2     MVP_1   MVP_2   WAR_1   WAR_2  
 1955      AL  Mickey Mantle  Al Kaline   5      2       9.5      9.0
 1955      N   Willy Mays     Duke Snider 4      2       9.3      8.9

и т. Д.

TIA

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Используйте группирование и условное агрегирование, например:

SELECT
  season,
  division,
  pl_1  = MAX(CASE rankWAR WHEN 1 THEN player  END),
  pl_2  = MAX(CASE rankWAR WHEN 2 THEN player  END),
  MVP_1 = MAX(CASE rankWAR WHEN 1 THEN rankMVP END),
  MVP_2 = MAX(CASE rankWAR WHEN 2 THEN rankMVP END),
  WAR_1 = MAX(CASE rankWAR WHEN 1 THEN WAR     END),
  WAR_2 = MAX(CASE rankWAR WHEN 2 THEN WAR     END)
FROM mlbmvpvoting
WHERE season IN ('1955', '1956')
  AND rankWAR IN (1, 2)
GROUP BY season, division
ORDER BY season, division

IN в основном более оптимизируемо, чем OR и <, поэтому я соответственно изменил условия.

0 голосов
/ 23 июня 2011

Посмотрите, подходит ли вам такое решение:

with mlbmvpvoting (season, division, player, MVP, WAR, rankWAR) as 
(
    select 1955,    'AL', 'Mickey Mantle',  5,   9.5,     1  union all
    select 1955,    'AL', 'Al Kaline',      2,   9.0,     2  union all
    select 1955,    'NL', 'Willie Mays',    4,   9.3,     1  union all
    select 1955,    'NL', 'Duke Snider',    2,   8.9,     2  union all
    select 1956,    'AL', 'Mickey Mantle',  1,   12.9,    1  union all
    select 1956,    'AL', 'Early Wynn',     13,  8.5,     2  union all
    select 1956,    'NL', 'Duke Snider',    10,  7.7,     1  union all
    select 1956,    'NL', 'Hank Aaron',     3,   7.5,     2
)
select
    season, 
    division,
    pl_1  = max(case rankWAR when 1 then player end),
    pl_2  = max(case rankWAR when 2 then player end),
    MVP_1 = max(case rankWAR when 1 then MVP end),
    MVP_2 = max(case rankWAR when 2 then MVP end),
    WAR_1 = max(case rankWAR when 1 then WAR end),
    WAR_2 = max(case rankWAR when 2 then WAR end)
from mlbmvpvoting
group by season, division
order by season;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...