最近在看《Oracle 11g資料庫管理員指南》這本書,發現書中有個錯誤。
示例:假設要求按照部門號對員工的工資進行統計,參加統計的員工工資必須大于1000 元,將統計結果中凡滿足最低工資在900元以上,并且工資總和在7000元以上的部門統計資訊顯示出來,顯示時按照工資總和從大到小排序,如果工資總和相同,再按照部門號從小到大排序。
書中給出的陳述句是:select deptno as 部門號,avg(sal) as 平均工資,min(sal) as 最低工資,max(sal) as 最高工資,sum(sal) as 工資總和 from emp where sal>1000 group by deptno having min(sal)>900 and sum(sal)>7000 order by max(sal) desc,deptno asc;
疑問:在where子句中已將員工工資低于1000元的資料剔除,不參與統計。所以輸出的資料中的sal全部是大于1000元的,結果,在having子句中,部門最低工資在900元以上的條件其實是多余的,沒有達到示例中要求的目的。請大神給出正確的陳述句。
uj5u.com熱心網友回復:
給樓主點個贊,為你求真求實的精神加油。你的分析是對的
uj5u.com熱心網友回復:
根據問題描述, 某人工資有多份 如果有一份工資大于1000就可以查詢出此人。 但是他還有一份最小的工資,所以在having 中再次進行了過濾,將最少一份工資低于900的人過濾掉。uj5u.com熱心網友回復:
大于1000的是個人工資,排除的是個人。 >900的是部門最低工資, 排除的是部門。uj5u.com熱心網友回復:
示例要求的是這樣沒錯,但從陳述句執行情況來看,是達不到示例所要求的那樣。因為在where子句中,已將所有工資低于1000元的員工剔除統計,所以在having子句中,所有部門的最低工資都是不低于1000元的。我現在就是想知道,如果要達到示例所要求的目的,SQL陳述句應該怎么寫。我上述的示例參考的表是oracle 11g中SCOTT用戶里自帶的example表。
uj5u.com熱心網友回復:
select deptno as 部門號,avg(sal) as 平均工資,min(sal) as 最低工資,max(sal) as 最高工資,sum(sal) as 工資總和from emp where sal>1000 and
deptno in(select deptno from emp group by deptno having min(sal)>900 and sum(sal)>7000)
group by deptno
order by max(sal) desc,deptno asc;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/85237.html
標籤:基礎和管理
