1. 程式人生 > >Oracle-SQL-group by-報錯:不是單組分組函式

Oracle-SQL-group by-報錯:不是單組分組函式

報錯:不是單組分組函式

例項: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子句可以讓我們篩選成組後的各組資料.