SQL查询:查找每个成本高于平均值的项目,以及成本高于平均值的项目

SQL查询:查找每个成本高于平均值的项目,以及成本高于平均值的项目,sql,Sql,我正在为数据库考试做一些复习,其中一个问题如下: 给定表Items(列:itemid,description,unitcost),制定一个查询,以查找成本高于平均值的每个项目以及成本高于平均值的多少 到目前为止,我的答案是 SELECT itemid, description, unitcost - AVG(unitcost) FROM Items WHERE unitcost > (SELECT AVG(unitcost) FROM Items)

我正在为数据库考试做一些复习,其中一个问题如下:

给定表
Items
(列:
itemid
description
unitcost
),制定一个查询,以查找成本高于平均值的每个项目以及成本高于平均值的多少

到目前为止,我的答案是

SELECT itemid, 
       description, 
       unitcost - AVG(unitcost) 
FROM Items 
WHERE unitcost > (SELECT AVG(unitcost) FROM Items)
  • 这样行吗?据我所知,在所选列的列表中允许使用表达式,但我不确定这是否扩展到使用函数,如
    AVG()
  • 有没有更干净、更清晰的方式来表达同样的事情?最好只使用ISO SQL结构,因为我的课程是理论性的,不涉及任何特定方言

谢谢朋友:)

这应该行得通,但我不明白你为什么要做减法

SELECT id, 
       title, 
       sort_price,
sort_price - (SELECT AVG(sort_price) as avg FROM item)
FROM item
WHERE sort_price> (SELECT AVG(sort_price) as items FROM item)

这应该行得通,但我不明白你为什么要做减法

SELECT id, 
       title, 
       sort_price,
sort_price - (SELECT AVG(sort_price) as avg FROM item)
FROM item
WHERE sort_price> (SELECT AVG(sort_price) as items FROM item)

带有子句的
是ANSI SQL,因此您可以编写如下内容:

WITH ap AS
 ( SELECT AVG(unitcost) avguc FROM Items )
SELECT i.itemid
     , i.description
     , (unitcost - a.avguc) avg_uc_diff 
FROM Items
   , ap a 
WHERE unitcost > a.avguc

带有
子句的
是ANSI SQL,因此您可以编写如下内容:

WITH ap AS
 ( SELECT AVG(unitcost) avguc FROM Items )
SELECT i.itemid
     , i.description
     , (unitcost - a.avguc) avg_uc_diff 
FROM Items
   , ap a 
WHERE unitcost > a.avguc

几乎任何版本的SQL(接受显式联接语法)都可以使用的一个查询是:

SELECT i.itemid, 
       i.description, 
       i.unitcost - a.avg_cost cost_diff
FROM (SELECT AVG(unitcost) avg_cost FROM Items) a
JOIN Items i
ON i.unitcost > a.avg_cost

几乎任何版本的SQL(接受显式联接语法)都可以使用的一个查询是:

SELECT i.itemid, 
       i.description, 
       i.unitcost - a.avg_cost cost_diff
FROM (SELECT AVG(unitcost) avg_cost FROM Items) a
JOIN Items i
ON i.unitcost > a.avg_cost

原始查询可以转换为有效(ANSI SQL)查询,只需稍作更改(使用窗口函数):


SQLFiddle示例:

只需稍作更改(使用窗口函数),即可将原始查询转换为有效的(ANSI SQL)查询:


SQLFIDLE示例:

在大多数SQL方言中,您可以使用窗口函数来实现此目的。也就是说,您可以为
avg()
函数使用
partition
子句:

SELECT itemid, 
       description, 
       unitcost - avgcost
FROM (select i.*, avg(unitcost) over () as avgcost
      from Items i
     ) i
WHERE unitcost > avgcost

在大多数SQL方言中,可以使用窗口函数来实现这一点。也就是说,您可以为
avg()
函数使用
partition
子句:

SELECT itemid, 
       description, 
       unitcost - avgcost
FROM (select i.*, avg(unitcost) over () as avgcost
      from Items i
     ) i
WHERE unitcost > avgcost

不,它不起作用,因为您缺少一个
groupby
@a_horse\u,名称为
groupby
什么?为什么?在符合标准的DBMS上运行时发生了什么?(提示:MySQL不兼容)@gabykag.Petrioli:不是查询中使用的方式。由于选择列表包含聚合列和非聚合列,因此需要使用
group by
(至少对于任何希望返回确定性结果的DBMS而言)-尽管分组不会返回所需的结果。@Elliot:您可以在线测试。这是您的问题:不,它不起作用,因为您缺少一个
group by
@a_horse_,其名称为
group by
什么和为什么?在符合标准的DBMS上运行时发生了什么?(提示:MySQL不兼容)@gabykag.Petrioli:不是查询中使用的方式。由于选择列表包含聚合列和非聚合列,因此需要使用
group by
(至少对于任何希望返回确定性结果的DBMS而言)-尽管分组不会返回所需的结果。@Elliot:您可以在线测试。这是你的问题:这不会给我区别:(@ergec-the-OP也问了“比平均it成本高多少*”,这不会给我区别:(@ergec-the-OP也问了“比平均it成本高多少*”,谢谢你的帮助!)我对此投了高票,但我勾选的答案看起来与我在论文评分方案中预期的最接近(不幸的是,课程中没有教授窗口功能!)谢谢你的帮助!:)我投了高票,但我勾选的答案看起来与我在论文评分方案中预期的最接近(不幸的是,课程中没有教授窗口功能!)这看起来非常接近于我期望在分数方案中看到的答案——即仅使用课程中教授的基本结构。非常感谢!这看起来非常接近我期望在分数方案中看到的答案——即仅使用课程中教授的基本结构。非常感谢!