GROUP BY 和 ORDER BY一起使用


GROUP BY 和 ORDER BY一起使用 

轉:http://lzfhope.blog.163.com/blog/static/636399220092554045196/

環境:oracle 10g
單單group by 或者order by本身沒有特別好寫的,因為這二者都是及其常用的sql句子的組成.
通常order by 和group by 沒有太多的關系,但是它們常常組合在一起用,完成分組加排序的功能.
例如有下表:        

 SQL> select * from students;        
                      ID AREA       STU_TYPE                  SCORE
        ---------------- ---------- -------- ----------------------
                       1 111        g                         80.00
                       1 111        j                         80.00
                       2 111        g                         80.00
                       .......


這個時候,執行這個語句是可以的:

 SQL> select stu_type,sum(score) from students group by stu_type;        
STU_TYPE SUM(SCORE)
         -------- ----------
         j               542
         g               689

但是如果執行下面這個語句,就會報告錯誤:

 SQL> select stu_type,sum(score) from students group by stu_type order by id;
select stu_type,sum(score) from students group by stu_type order by id
ORA-00979: 不是 GROUP BY 表達式

正確的應該是這樣的:

 SQL> select stu_type,sum(score) from students group by id,stu_type order by id;
STU_TYPE SUM(SCORE)
-------- ----------
g               237
j                80
g               140
j               135
g               133
j               148
g               179
j               179
8 rows selected

也許結果不是所願,但是主要為了明白一個簡單的道理:order by 中列,應該出現在group by 子句中。這是一個很顯然的道理。 

 

 

 

 

 

 

 

======================

 

GROUP BY 和 ORDER BY一起使用


 

寫程序也有很長的一段時間了,有些東西我總不曾去思考,很少去積累一些有用的東西,總喜歡“用要即拿”的心態來對待,這是非常不好的壞習慣。這樣只會造成依賴心太強,每當遇到一些小小的問題都需要去翻資料。就好像今天寫一條查詢語句的時候,連group by 和 order by連用都不清楚,我想我以后得注意這些問題。

正確使用如下:

以下是引用片段:
SELECT dep.department_name, MAX(emp.salary), MIN(emp.salary)  
FROM departments dep  
LEFT JOIN employees emp  
ON (dep.department_id = emp.department_id)  
GROUP BY dep.department_name  
--order by 的列,必須是出現在group by 子句里的列   
ORDER BY dep.department_name DESC

錯誤使用如下:(執行后報錯:ORA-00979:不是GROUP BY 表達式)

以下是引用片段:
SELECT dep.department_name, MAX(emp.salary), MIN(emp.salary)  
FROM departments dep  
LEFT JOIN employees emp  
ON (dep.department_id = emp.department_id)  
GROUP BY dep.department_name  
--order by 的列,應該出現在group by 子句中   
ORDER BY dep.department_id DESC
=========================================

 

GROUP BY 和 ORDER BY一起使用時,ORDER BY要在GROUP BY的后面。

 

group by a,b,c       則a,b,c三個字段是按照先按a字段對數據行進行排序,再按b字段對那些字段a為同一個值的數據行進行排序,再再按c字段對那些字段a為同一個值且字段b為同一個值的數據行進行排序

 

order  by a,b,c   也是如此

 

故而

表T 有a,b,c三個字段,按a分組再按c排序的方法如下:

select * from T order  by a,c//兩個字段順序不能顛倒

或者

select * from T group  by a,c//兩個字段順序不能顛倒

 

參考

order by group by 一起用  谷歌

order by and group by together in sql    谷歌

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM