2015-12-04 100 views
-1

此查詢返回錯誤,如它不包含在聚合函數或GROUP BY子句中。group by without aggregate function並從中獲取一個值

SELECT SPEC_VALUE,SPEC_SKU 
FROM spec 
    join specdb on specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 

這將返回

1 0035862 
2 0051197 
2 0063493 
2 0013372 
2 0089991 
3 0087134 
4 0002602 
5 0002041 
5 0002042 
5 0002050 
5 0002044 
5 0024315 
6 0085601 
6 0090337 
7 0002789 
7 0002790 
7 0002791 

現在我想查詢應該返回值第一組像

1 0035862 
2 0051197 
3 0087134 
4 0002602 
5 0002041 
6 0085601 
7 0002789 

我試圖

SELECT SPEC_VALUE,SPEC_SKU 
FROM spec 
    JOIN specdb on specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 
GROUP BY spec.SPEC_VALUE 

但它顯示錯誤:

"it is not contained in either an aggregate function or the GROUP BY clause."

我使用不同,但它也顯示錯誤。

+1

鮮明的是幾乎從來沒有一個妥善的解決辦法。一種解決方案是使用聚合函數,如'min(SPEC_SKU)作爲SPEC_SKU'。 – Arvo

+0

您沒有ORDER BY子句,只有這兩列第一個值沒有意義。 – Mihai

+0

您將無法選擇那些沒有列出的訂單欄,以告知引擎您希望從每個組的重複項中獲得您想要的值。 –

回答

-1

看起來你要使用的最小功能上的SKU爲返回的每個SPEC:

SELECT SPEC_VALUE 
,MIN(SPEC_SKU) 
FROM spec 
JOIN specdb 
ON specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 
GROUP BY spec.SPEC_VALUE 
+0

'2 0051197'這不是最小的。 OP希望每個組都有「第一」行,但他不知道用他提供的列是不可能的。 –

+0

如果他不知道這是不可能的,向他說明什麼是可能的?他需要彙集任何不屬於該組的列,但顯然這是一個新概念。爲什麼不在評論和讚譽之前讓OP回答? – Vinnie

+0

我已經知道沒有OP,你的查詢將返回'2 0013372',但他想'2 0051197',所以這是不正確的答案。 –

-1

假設你希望每個的第一個實例,您可以通過如下使用分區:

SELECT * FROM(
select ROW_NUMBER() OVER(PARTITION BY SPEC_VALUE ORDER BY SPEC_VALUE DESC) AS ROWNUMBER, 
SPEC_VALUE, 
SPEC_SKU 
FROM @temp) AS t1 
WHERE t1.ROWNUMBER = 1 

你可以使用上面的方法來獲得不同的結果集。

+0

'2 0051197'這不是最大值。 OP希望每組的第一排,但是他不知道用他提供的欄杆是不可能的。 –

+0

好吧,我不想返回最大值,我期望不會。上面的結果集給出了操作後的內容(即每個SPEC_VALUE的第一行)。 – ricky89

+0

nope,那是不正確的。您可以認爲它會返回第一個值,但在其他機器上的結果可能不同。你在不斷地訂購。 –

0

此錯誤是告訴你,憑什麼我(SQL服務器)上Spec_Value進行集團通過操作?你的情況Spec_sku不包含任何聚合函數,它是不是在集團通過條款。

要麼你想選擇一個特定的值(例如MINSUM,或AVG),在這種情況下,你會使用相應的聚合函數,或者你要選擇的每一個值作爲新行(即包括Spec_sku在GROUP BY字段列表中)。但在我們的情況下,即不是我們的要求和注意您不能使用TOP Spec_sku列的功能,帶有分組子句。

所以根據輸出要求試試這個代碼一旦

;with cte as 
(
SELECT SPEC_VALUE,SPEC_SKU, ROW_NUMBER() OVER (PARTITION BY SPEC_VALUE ORDER BY SPEC_VALUE) AS rn 
FROM spec as s 
    JOIN specdb as sd on s.tech_no = Sd.TECH_NO 
WHERE S.TECH_NO = '20081') 

select SPEC_VALUE,SPEC_SKU from cte where rn=1 

輸出

SPEC_VALUE SPEC_SKU 
1   0035862 
2   0051197 
3   0087134 
4   0002602 
5   0002041 
6   0085601 
7   0002789 
+1

這與ricky89的回答中的選擇相同。一天早上,你會發現令人驚訝的是,你的選擇會選擇不同的值。訂單不保證。 –