考慮查詢:
查找總工資大于所有部門總工資平均值的所有部門
with dept_total (dept_name, value) as
(
select dept_name, sum(salary)
from instructor
group by dept_name
),
dept_total_avg(value) as
(
select avg(value)
from dept_total
)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total avg.value;
在不使用 with 構造的情況下重寫此查詢。
該查詢基于 Korth 的資料庫系統概念提供的大學模式。我假設我只需要考慮教師表即可找到查詢的答案。
講師(ID,姓名,dept_name,薪水)
我可以找到所有部門的總工資的平均值
SELECT AVG(salary) GROUP BY dept_name;
然后我輸了。我沒有找到繼續的方法。
我發現那個。但我正在尋找更多解釋,因為我無法從這個鏈接理解它。
謝謝你的幫助。
uj5u.com熱心網友回復:
看了你上一個問題,發現你用的是mysql5.8,那你就可以使用分析功能了
select distinct t1.dept_name
from (
select t1.*,
sum(salary) over(partition by dept_name) val,
sum(salary) over() / count(distinct dept_name) over() avg
from Instructor t1
) t1
where t1.val > t1.avg
uj5u.com熱心網友回復:
這是在不支持 CTE 的 mySQL 版本中執行此操作的幾種方法(我假設這就是為什么他們讓您重寫查詢以省略 with)。此外,您正在按部門計算平均工資,但問題是要求找到每個部門的平均總工資,然后回傳高于該值的工資。
https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=fefea829cff3e20aea93634f9a4114d6
使用子查詢:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
WHERE salaries > (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
)
加入:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
CROSS JOIN (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
) avgs
WHERE salaries > avgs.avgSalaries
使用會話變數(在更高版本中已棄用,但仍然有效):
SELECT avg(salaries) INTO @avg FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z;
SELECT @avg;
SELECT dept_name
FROM instructor GROUP BY dept_name
HAVING sum(salary) > @avg;
所有好的技術都可以理解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341354.html
