2016-04-26 63 views
1

當比方說,我有以下查詢:SQL:默認行爲使用GROUP BY

SELECT colA, colB, colC, colD 
FROM table 
GROUP BY colC, colD 

此查詢不上MS SQL Server運行,因爲列colAcolB不是GROUP BY的一部分,也不總計。

現在,我知道所有其他列將在每個組內具有相同的值。所以我可以通過爲colAcolB選擇一個像MAX這樣的集合來解決這個問題,或者只需將它們添加到GROUP BY即可。

但是,這是我的問題:上面的查詢只是一個例子,但我真正有幾個非常長的查詢有很多列。我想知道的是:我可以爲其餘列設置默認聚合函數或類似的東西,所以我不需要必須在GROUP BY中手動包括所有剩餘的列,或手動將聚合應用於所有選定的塊?

+2

答案是否定的!一般的GROUP BY規則說:「如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或作爲set函數的參數。」 – jarlh

+0

這裏有一個很好的考慮因素:如果你已經在你的SELECT列表中指定了ColA,ColB,... ColN,它將很快複製粘貼到GROUP BY子句中:)看起來你不需要需要一個複雜的解決方案。 –

+1

假設您有一輛沒有輪胎的汽車,您想添加所有輪胎。你可以添加一個,並期望汽車去做其餘的? – CiucaS

回答

2

NO。

相反,對於每一對colC-colD,您只能得到一行,而對其他列取得的值的控制很少。您可以使用行編號功能。

增加一列,數列由團(每對夫婦COLC冷):

select colA, colB, colC, colD, 
row_number() over (partition by colC, colD order by colA, colB) as Sequence 
FROM table 

在MSSQL中不能使用where子句中ROW_NUMBER。如果你想看到的只是一排每對夫婦COLC冷,你必須把所有的子查詢:

select colA, colB, colC, colD 
from (
    select colA, colB, colC, colD, 
    row_number() over (partition by colC, colD order by colA, colB) as Sequence 
    FROM table 
) T 
where Sequence = 1 

用這種方法你可以看到所有其他列的只有一排,但你不能選擇一個集合函數

所有您可以選擇的是訂單標準,這意味着哪一行的編號爲「1」,更改零件order by colA, colB