单表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就无法计算平均值了。