GROUP BY子句有個(gè)缺點(diǎn),就是返回的結(jié)果集中只有合計(jì)數(shù)據(jù),而沒有原始的詳細(xì)記錄。如果想在SQL SERVER中完成這項(xiàng)工作,可以使用COMPUTE BY子句。COMPTE生成合計(jì)作為附加的匯總列出現(xiàn)在結(jié)果集的最后。當(dāng)與BY一起使用時(shí),COMPUTE 子句在結(jié)果集內(nèi)生成控制中斷和分類匯總。
下列 SELECT 語句使用簡單 COMPUTE 子句生成 titles 表中 price 及 advance 的求和總計(jì):
復(fù)制代碼 代碼如下:
USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance)
下列查詢在 COMPUTE 子句中加入可選的 BY 關(guān)鍵字,以生成每個(gè)組的小計(jì):
USE pubs
復(fù)制代碼 代碼如下:
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type
此 SELECT 語句的結(jié)果用12 個(gè)結(jié)果集返回,六個(gè)組中的每個(gè)組都有兩個(gè)結(jié)果集。每個(gè)組的第一個(gè)結(jié)果集是一個(gè)行集,其中包含選擇列表中所請求的信息。每個(gè)組的第二個(gè)結(jié)果集包含 COMPUTE 子句中兩個(gè) SUM 函數(shù)的小計(jì)。
compute by 子句的規(guī)則:
(1)不能將distinct與行統(tǒng)計(jì)函數(shù)一起使用
(2)compute ??? by 子句中 ???出的列必須出現(xiàn)在選擇列表中
(3)不能在含有compute by 子句的語句中使用select into 子句,因?yàn)榘╟ompute 子句的語句會產(chǎn)生不規(guī)則的行。
(4)如果使用了compute by子句,則必須使用order by 子句, 而且compute by子句中的列必須包含在order by 子句中,并且對列的前后順序和起始項(xiàng)都要一致(說白了compute by子句中的列必須是order by子句中列表的全部,或者前邊的連續(xù)幾個(gè))。
(5)如果compute 省略了 by ,則order by 也可以省略
(6)如果compute by 子句包含多列時(shí),會將一個(gè)組(第一個(gè)列分的組)分成若干個(gè)子組(利用后面的列),并對每層子組進(jìn)行統(tǒng)計(jì)。
(7)使用多個(gè)compute by子句時(shí),會分別按不同的組統(tǒng)計(jì)出結(jié)果。詳細(xì)信息還是按照正常的第一個(gè)分組方式顯示。
(8)compute by 子句中可以使用多個(gè)統(tǒng)計(jì)函數(shù),他們互不影響
(9)compute by 子句中可以不包含by ,而只用compute 此時(shí)不對前面信息分組,而只對全部信息進(jìn)行統(tǒng)計(jì)。
比較 COMPUTE 和 GROUP BY
COMPUTE 和 GROUP BY 之間的區(qū)別匯總?cè)缦拢?
GROUP BY 生成單個(gè)結(jié)果集。每個(gè)組都有一個(gè)只包含分組依據(jù)列和顯示該組子聚合的聚合函數(shù)的行。選擇列表只能包含分組依據(jù)列和聚合函數(shù)。
COMPUTE 生成多個(gè)結(jié)果集。一類結(jié)果集包含每個(gè)組的明細(xì)行,其中包含選擇列表中的表達(dá)式。另一類結(jié)果集包含組的子聚合,或 SELECT 語句
的總聚合。選擇列表可包含除分組依據(jù)列或聚合函數(shù)之外的其它表達(dá)式。聚合函數(shù)在 COMPUTE 子句中指定,而不是在選擇列表中。
下列查詢使用 GROUP BY 和聚合函數(shù);該查詢將返回一個(gè)結(jié)果集,其中每個(gè)組有一行,該行中包含該組的聚合小計(jì):
USE pubs
SELECT type, SUM(price), SUM(advance)
FROM titles
GROUP BY type
說明 在 COMPUTE 或 COMPUTE BY 子句中,不能包含 ntext、text 或 image 數(shù)據(jù)類型。