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成本高多少*”,谢谢你的帮助!)我对此投了高票,但我勾选的答案看起来与我在论文评分方案中预期的最接近(不幸的是,课程中没有教授窗口功能!)谢谢你的帮助!:)我投了高票,但我勾选的答案看起来与我在论文评分方案中预期的最接近(不幸的是,课程中没有教授窗口功能!)这看起来非常接近于我期望在分数方案中看到的答案——即仅使用课程中教授的基本结构。非常感谢!这看起来非常接近我期望在分数方案中看到的答案——即仅使用课程中教授的基本结构。非常感谢!