2014-02-24 29 views
0

我希望能够通过LgID和YearID选择顶级Max(HR)领导者。但我也想要播放器的名称列。 (T-SQL,SQL Server 2012 Express)Group By的问题 - 想要在不使用Group By的情况下调用列(T-SQL,SQL Server)

当我用玩家名称查询时,它会为每个最大(HR)输出返回“0”。看来SQL Server 2012 Express不会允许我在select语句中使用它时忽略组中的PlayerID。有没有办法得到这个?什么时候?或者是其他东西?

Select 
    playerID, 
    yearID, 
    lgID, 
    Max(HR) HR_Leader 
from batting 
group by 
    yearID, 
    lgID 
order by 
    yearID desc, 
    lgID, 
    Max(HR) 

Returns this error: 
Msg 8120, Level 16, State 1, Line 2 
Column 'batting.playerID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

但是当我注释掉PlayerID,它运行,但我没有名字,因为在这里看到:1评论/问题后

Select 
    --playerID, 
    yearID, 
    lgID, 
    Max(HR) HR_Leader 
from batting 
group by 
    yearID, 
    lgID 
order by 
    yearID desc, 
    lgID, 
    Max(HR) 

yearID lgID HR_Leader 
2013 AL 53 
2013 NL 36 
2012 AL 44 
2012 NL 41 
2011 AL 43 
2011 NL 39 
2010 AL 54 
2010 NL 42 
2009 AL 39 
2009 NL 47 

更新。

Select 
    playerID, 
    yearID, 
    lgID, 
    Max(HR) HR_Leader 
from batting 
group by 
    playerID, 
    yearID, 
    lgID 
order by 
    yearID desc, 
    lgID, 
    Max(HR) desc 


Query Returns this: Which doesn't have the look of the 1st output (

playerID yearID lgID HR_Leader 
davisch02 2013 AL 53 
cabremi01 2013 AL 44 
encared01 2013 AL 36 
dunnad01 2013 AL 34 
trumbma01 2013 AL 34 
jonesad01 2013 AL 33 
longoev01 2013 AL 32 
ortizda01 2013 AL 30 
mossbr01 2013 AL 30 
beltrad01 2013 AL 30 

我想是这样的:

PlayerID  yearID lgID HR_Leader 
Player1  2013   AL 53 
Player2  2013   NL 36 
Player3  2012   AL 44 
Player4  2012   NL 41 
Player5  2011   AL 43 
Player6  2011   NL 39 
Player7  2010   AL 54 
Player8  2010   NL 42 
Player9  2010   NL 42 
+0

由于您基于yearID和lgID(但不是playerID)对行进行分组,因此您希望分组行中playerID的值为多少? –

+0

我想要播放器名称,但当我将播放器ID放入分组依据时,它不会仅返回SQL Server中的最大(HR)值。它返回所有总数。我将把它放在上面的例子中...... – Paul

+0

SQL只能在那里返回一个值,但它不知道它们都是一样的。如果您碰巧知道所有名称对于yearID和lgID的特定组合都是相同的,则可以使用'MAX(playerID)'或'MIN(playerID)'。 –

回答

0

这里的简单方法。使用公共表格表达式(CTE)获得每个联赛和年度的顶级人力资源。然后再加入击球以获得拥有这些数字的球员。样本数据包含一条以特定顺序返回双方球员的平局。

CREATE TABLE batting (playerID INT, yearID INT, lgID CHAR(2), HR INT) 

INSERT INTO batting 
SELECT 1, 2010, 'AL', 40 UNION 
SELECT 2, 2010, 'AL', 35 UNION 
SELECT 3, 2010, 'NL', 35 UNION 
SELECT 4, 2010, 'NL', 30 UNION 
SELECT 5, 2011, 'AL', 50 UNION 
SELECT 6, 2011, 'AL', 45 UNION 
SELECT 3, 2011, 'NL', 45 UNION 
SELECT 7, 2011, 'NL', 45 UNION 
SELECT 4, 2011, 'NL', 40 

;WITH cte AS (
    SELECT yearID 
     ,lgID 
     ,MAX(HR) HR_Leader 
    FROM batting 
    GROUP BY yearID 
      ,lgID 
) 
    SELECT playerID 
     ,c.* 
    FROM batting b 
     INNER JOIN 
     cte c ON b.yearID=c.yearID 
       AND b.lgID=c.lgID 
       AND b.HR=c.HR_Leader 
    ORDER BY c.yearID DESC 
      ,c.lgID 

DROP TABLE batting