emmmmmmm..... sql表关联本身做查询

单表sql查询 查询表中所有工资大于本部门平均工资的员工姓名

如下sql是正确的,所以不用改sql啦 只是我不明白这个为什么可以做到 (实现原理)

 SELECT
    a.name,
    a.money,
    a. NO
FROM
    part a
WHERE
    a.money > (
        SELECT
            AVG (b.money)
        FROM
            part b
        WHERE
            a. NO = b. NO
    )

这条sql是查询部门工资大于本部门平均工资的sql a.no=b.no 竟然实现了分组的功能 百度找不到相关信息 有点懵

你可能对SQL语句执行的流程不很熟悉,推荐你看一下关于这方面的书《Microsoft SQL SERVER 2008技术内幕 T-SQL查询》。
这个语句解释一下:

本查询语句为单表查询——FROM子句不做笛卡尔运算,WHERE子句中做了两个运算,一个where字句中做了与外部查询的关联,此处相当于做了一个group子句,然后再select子句中输出avg平均值,最后再看外部查询就很容易理解了吧。

相当于如下语句:

SELECT
a.name,
a.money,
a. NO
FROM
part a
WHERE
a.money >(select
c.avg_num
from
(SELECT
b.no as no,
AVG (b.money) as avg_num
FROM
part b
group by b.no) c
WHERE
a. NO = c. NO
)

a.no=b.no放在夸号里面就是做为计算平均值的条件。你把这条件放到外面做为整体条件试试。

a.no=b.no放在夸号里面就是做为计算平均值的条件。你把这条件放到外面做为整体条件试试。

a.no=b.no放在夸号里面就是做为计算平均值的条件。你把这条件放到外面做为整体条件试试。

要不试试这个,楼主试试能不能成功呢
SELECT
a.name,
a.money,
a. NO
FROM
part a
across apply (select top 1 * from part b
where a. NO = b. NO and a.money > AVG (b.money))

这条语句有问题么?不知道楼主要问什么,是不明白这个语句的执行流程么?

你这个需要在part b 后面加上part a 吧,这条sql语句要先运行 SELECT
AVG (b.money)
FROM
part b
WHERE
a. NO = b. NO
如果不加的话,你的a是什么,程序找不到a代表的什么,自然会报错。
还有我不知道你问的到底是什么意思,如果我说的这个没解决你的问题,麻烦楼主问的清楚点,是不明白语句执行,还是哪出错了

試一下

  SELECT
    a.name,
    a.money,
    a. NO
FROM
    part a,
        (
        SELECT
            AVG(b.money) as avgMoney,
                        b.NO
        FROM
            part b
                GROUP BY
                    b.NO
    ) c

WHERE
    a. NO = c. NO AND a.money > c.avgMoney;

我认为是因为括号里的sql语句里本身也没有除了组函数之外的字段,所以不需要用group by来分组吧

楼楼 测试试了下你的sql,此处的a.NO=b.NO 不对哟,如果你想要的是整个部门的平均值,可以如果如下。
SELECT
a.name,
a.money,
a. NO
FROM
part a
WHERE
a.money > (
SELECT
AVG (b.money)
FROM
part b )

因为AVG和条件a.No = b.No,这样得到的就是每个组的平局值,然后又以这个为查询条件得到的结果自然被分组了

是因为条件写成这样where。。。所以自然按照这个分组吧

括号里面是子查询,先是查出括号内的数据在执行外面的,这样就清晰了

SELECT
a.name,
a.money,
a. NO
FROM
part a
WHERE
a.money > (
SELECT
AVG (b.money)
FROM
part b
WHERE
a. NO = b. NO
)
这个是那a的一条数据和b的相同的进行表关联,也只能查出一条,所以平均值还是他自己,你让a.money>大于他自己,所以查不到你要的结果
这个可以查到你要的数据
SELECT
a.name,
a.money,
a. NO
FROM part a
WHERE
a.money > ( SELECT AVG (b.money) FROM part b )

a.no=b.no放在夸号里面就是做为计算平均值的条件。你把这条件放到外面做为整体条件试试。

SELECT
AVG (b.money)
FROM
part b
WHERE
a. NO = b. NO 是按分组后的平均值,

                    SELECT
a.name,
a.money,
a. NO

FROM
part a
WHERE
a.money > (
SELECT
AVG (b.money)
FROM
part b
WHERE
a. NO = b. NO
) 相当于
SELECT
a.name,
a.money,
a. NO
FROM
part a
WHERE
a.money > (
分组后平均值
)

    这样自然就查出来了

该sql 只是将a 与 b 内关联,取两者相同的钱数进行平均值,楼主为什么会认为sql就是对的呢?

没有a.no=b.no就无法计算平均值了。