【问题标题】:Another pivot SQL Server query另一个透视 SQL Server 查询
【发布时间】:2011-06-23 16:31:24
【问题描述】:

不幸的是,我无法完全理解前面的例子。

我正在尝试根据多年来对棒球 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

【问题讨论】:

    标签: sql-server pivot


    【解决方案1】:

    使用分组和条件聚合,如下所示:

    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&lt;更优化,所以我相应地改变了条件。

    【讨论】:

    • 谢谢。我刚刚将 WHERE season IN 扩展到所有季节(从 mlbmvpvoting 中选择不同的季节)并且离开了。如果有人对使用结果进行分析感兴趣——尤其是与威利·梅斯有关的——我在这里写了博客tinyurl.com/6kr28dl
    【解决方案2】:

    看看这样的解决方案是否适合你:

    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;
    

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 2012-11-13
      • 1970-01-01
      • 2016-10-28
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多