2013-04-06 75 views
1

在PostgreSQL文檔,它說:示例GROUP BY限制

當GROUP BY存在時,它是無效的SELECT列表表達式來指未分組列除了聚集函數內,或者如果未分組列在功能上依賴於分組的列,因爲本來是一個以上的可能值來返回未分組的列

我不理解「there would otherwise be more than one possible value to return for an ungrouped column」的部分。

有人能給我舉個例子嗎?怎麼能有一個可能的值返回一個取消組合列?

+3

查詢在哪裏? – 2013-04-06 00:29:04

+0

我要求提供文檔示例/說明,而不是針對特定問題的解決方案 – Chin 2013-04-06 00:31:15

+0

我重新考慮了我的問題。正如我所說,這只是關於文檔。我只是想了解它。 – Chin 2013-04-06 00:41:10

回答

2

考慮一下這個表:

col_1 | col_2 | col_3 
A  10  10 
A  11  20 
B  20  40 
C  40  60 

並嘗試運行該查詢,總結了

SELECT col_1, col_2, SUM(col_3) 
FROM t1 
GROUP BY col_1 

上面的查詢可以col_3值2個可能的輸出:

Output 1: Here, col_2 = 10 
--------------------------- 
col_1 | col_2 | SUM(col_3) 
A   10   30  
B   20   40 
C   40   60 

Output 2: Here, col_2 = 11 
--------------------------- 
col_1 | col_2 | SUM(col_3) 
A   11   30 
B   20   40 
C   40   60 

這是因爲col_2不包含在GROUP BY子句中。求和col_3發生,因爲預期基於由COL_1分組但現在的SQL引擎不知道你是否想與具有COL_2行的11或11,因此,「有,否則將不止一個可以返回的值對於未分組列」

上面的查詢將正常工作與MySQL,它會隨機返回上述2個輸出而Oracle/SQL服務器的人會扔你提到的錯誤

0

比方說,你有一張桌子......名字,城市,電話號碼。你想按城市計算人數。所以你按城市選擇城市和數量。在查詢中包含電話號碼(未分組)是沒有意義的,因爲每個分組最多可能會有多個電話號碼,並且分貝不知道您想要什麼。

1

存在,否則將對於未分組的列可返回多個可能的值

讓我嘗試用數據的小樣本來解釋這一點:

CREATE TABLE yourtable ([year] int, [amt] int); 

INSERT INTO yourtable ([year], [amt]) 
VALUES 
    (2012, 50), 
    (2012, 60), 
    (2011, 100), 
    (2011, 89), 
    (2013, 25); 

該樣品有3個獨立多年,現在我們希望得到每年的量的總和。

如果您使用查詢:

select year, sum(amt) TotalPerYear 
from yourtable 

而且你沒有提供的YearGROUP BY,那麼如何將數據庫引擎知道什麼樣的價值,爲今年選擇,因爲在一個以上的值柱。

GROUP BY是說我想每年的總和,這並不是說我想要的總和,無論它決定的一年。

select year, sum(amt) TotalPerYear 
from yourtable 
group by year 

GROUP BY在選擇每列,確保您得到的分組列正確的聚集。

MySQL是一個允許此行爲的數據庫,它包含選擇列表中不屬於group by或aggregate函數的列的explicitly states in the docs可能導致意外的結果。

從MySQL的文檔:

您可以使用此功能,避免不必要的列排序和分組,以獲得更好的性能。 但是,這對於每個組中未在GROUP BY中指定的每個非聚集列中的所有值都相同時都很有用。服務器是可以自由選擇每組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,從每個組中選擇值不受添加ORDER BY子句的影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。