1

我掉进了 SQL 兔子洞,请帮帮我,我需要在没有 with 子句的情况下重写这个查询

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 子句,它就可以用任何方式编写。我一直在考虑 - 选择 sum(salary)/count(salary) as dept_total_avg, dept_name from coach where dept_total_avg > all (select sum(salary), from coach) 按 dept_name 分组;

但它不起作用,现在我的大脑也不起作用。请帮忙。

4

1 回答 1

0

您需要在没有访问中间 cte 的情况下计算部门平均值dept_total

SELECT
    dept_total.dept_name, dept_total.value, cj.dept_av
FROM (
    SELECT
        dept_name, SUM(salary) value
    FROM instructor
    GROUP BY
        dept_name
    ) AS dept_total
CROSS JOIN (
        SELECT
            SUM(salary) / (COUNT(DISTINCT dept_name) * 1.0) dept_av
        FROM instructor
    ) cj
WHERE dept_total.value >= cj.dept_av
;

在原始查询中,有 2 个“公用表表达式”(cte),每个都有一个名称,以便以后可以引用它们。

其中第一个被命名为dept_total

允许任何后续 cte 以该名称重用该 cte。然而,传统的“派生表”子查询无法实现 cte 的这种重用方面。因此,dept_total在最终查询中使用名称的地方,您必须替换一种新方法来获得部门平均值。


如果您不知道,现在可以使用 MySQL 8 并且它支持“公用表表达式”(the with clause

于 2018-11-02T00:29:19.290 回答