2014-02-24 32 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