Oracle-SQL-group by-報錯:不是單組分組函式
阿新 • • 發佈:2019-02-08
報錯:不是單組分組函式
例項:select deptno,count(empno) from emp;
報錯:不是單組分組函式
原因:
1,如果程式中使用了分組函式,則有兩種情況可以使用:
程式中存在group by,並指定了分組條件,這樣可以將分組條件一起查詢出來
改為:select deptno,count(empno) from emp group by deptno;
如果不使用分組的活,則只能單獨使用分組函式
改為:select count(empno) from emp;
2,在使用分組函式的時候,不能出現分組條件之外的欄位
總結:在select需要查詢的語句中選中的欄位,必須出現在group by子句中,除了分組函式的引數。
====================================================================================================
用途:
對結果集進行分組,常與彙總函式一起使用。
語法:SELECT column,SUM(column) FROM table GROUP BY column
例:
“Sales” 表中的原始資料 :
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
按照 Company 欄位進行分組,求出每個 Company 的 Amout 的合計:
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company
返回結果 :
Company SUM(Amount)
W3Schools 12600
IBM 4500
Having 用途: 指定群組或彙總的搜尋條件。
語法:
SELECT column,SUM(column) FROM table GROUP BY column HAVING SUM(column) condition value
解釋:
HAVING 通常與 GROUP BY 子句同時使用。不使用 GROUP BY 時, HAVING 則與 WHERE 子句功能相似。
例:
“Sales” 表中的原始資料 :
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
按照 Company 欄位進行分組,求出每個 Company 的 Amout 的合計在 10000 以上的資料:
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company HAVING SUM(Amount)>10000
返回結果 :
Company SUM(Amount)
W3Schools 12600
舉一個CSDN論壇上的例子:
例如表 A
Name Grade
小明 2
小王 1
小利 3
旺才 2
小強 3
你如果想按年級統計人數就可以:
SELECT Grade, COUNT(*) AS 人數 FROM A GROUP BY Grade
Grade 人數
----------- -----------
1 1
2 2
3 2
====================================================================================================
HAVING:
在介紹GROUP BY 和 HAVING 子句前,我們必需先講講sql語言中一種特殊的函式:聚合函式,例如SUM, COUNT, MAX, AVG等。這些函式和其它函式的根本區別就是它們一般作用在多條記錄上。 SELECT SUM(population) FROM bbc 這裡的SUM作用在所有返回記錄的population欄位上,結果就是該查詢只返回一個結果,即所有國家的總人口數。通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函式對屬於一組的資料起作用。當你指定 GROUP BY region 時,屬於同一個region(地區)的一組資料將只能返回一行值.也就是說,表中所有除region(地區)外的欄位,只能通過 SUM, COUNT等聚合函式運算後返回一個值. HAVING子句可以讓我們篩選成組後的各組資料. WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前.而 HAVING子句在聚合後對組記錄進行篩選。 讓我們還是通過具體的例項來理解GROUP BY 和 HAVING 子句,還採用第三節介紹的bbc表。
SQL例項: 一、顯示每個地區的總人口數和總面積. SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region 先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函式對每組中的不同欄位(一或多條記錄)作運算。
二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。 SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area) > 1000000 在這裡,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。相反,HAVING子句可以讓我們篩選成組後的各組資料.