2015-06-03 60 views
0

我有以下形式的T-SQL查詢:SQL服務器MAX和GROUP BY不能很好地一起玩

SELECT   f.fizz_name, b.buzz_version, fu.foo_name 
FROM   fizz f 
INNER JOIN  buzz b 
ON    f.fizz_id = b.fizz_id 
INNER JOIN  foo fu 
ON    b.buzz_id = fu.buzz_id 
WHERE   f.bar LIKE 'YES' 

當我運行此查詢我得到如下結果:

fizz_name buzz_version foo_name 
==================================== 
Gamma  0.3.960   Test 
Gamma  0.3.961   Test 
Gamma  0.3.960   Test 
Gamma  0.3.961   Test 
Delta  0.3.2588  Test 
Delta  0.3.2589  Test 
Delta  0.3.2588  Test 
Delta  0.3.2589  Test 
Echo  2.2.38   Test 
Echo  2.2.38   Test 

的問題在於它包含了許多我不關心的條目。在現實中,我只關心每個fizz實例的最大buzz_version,換句話說:

fizz_name buzz_version foo_name 
==================================== 
Gamma  0.3.961   Test 
Delta  0.3.2589  Test 
Echo  2.2.38   Test 

...因爲「2.2.38」是Echo最新/ lexiconographically-最高buzz_version,和同爲其他的嘶嘶聲。

所以我想在演唱會上使用GROUP BYMAX像這樣來獲取這些值:

SELECT   f.fizz_name, MAX(b.buzz_version), fu.foo_name 
FROM   fizz f 
INNER JOIN  buzz b 
ON    f.fizz_id = b.fizz_id 
INNER JOIN  foo fu 
ON    b.buzz_id = fu.buzz_id 
WHERE   f.bar LIKE 'YES' 
GROUP BY  b.buzz_version 

但是,這給了我一個錯誤:

Column 'fizz.fizz_name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我要去哪裏錯了,爲什麼?

+3

您正按查詢中的聚合進行分組。您需要按標量列進行分組。在這種情況下,按f.fizz_name組,fu.foo_name –

+2

假設您的版本號是字符串,如果您不小心數據,則max可能會導致您遇到問題。例如0.10.1由於字母順序排序而比0.2.1更小版本 –

+0

感謝@SeanLange(+1) - 把它放在答案中,我會給它一個綠色檢查! – smeeb

回答

1

您正按查詢中的聚合進行分組。您需要按標量列進行分組。在這種情況下,按f.fizz_name分組,fu.foo_name

1

您希望每個fizz_name有一個結果行,因此您必須按fizz_name進行分組。你用它顯示MAX(b.buzz_version),並且必須決定顯示哪個fu.foo_name。例如:

SELECT f.fizz_name, MAX(b.buzz_version), MAX(fu.foo_name) 
FROM fizz f 
INNER JOIN buzz b ON f.fizz_id = b.fizz_id 
INNER JOIN foo fu ON b.buzz_id = fu.buzz_id 
WHERE f.bar LIKE 'YES' 
GROUP BY f.fizz_name; 
+0

感謝@Thorsten Kettner(+1) - 請參閱我對JamesZ的評論,關於在此示例中使用MAX(...)'。任何想法是什麼將是一個更合適的聚合?再次感謝! – smeeb

+0

您將不得不格式化您的版本字符串。假設第一個和第二個地方總是一個數字,但第三個是一到五位數字:MAX(stuff(b.buzz_version,4,1,replicate('0',9-len(b.buzz_version) )))'。如果第一個和第二個數字也可以超過一個數字,那麼您需要另一個字符串操作。在此查找SQL Server字符串函數。 –