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

时间:2013-04-25 12:33:59

标签: sql

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

根据表Items(列:itemiddescriptionunitcost),制定查询以查找费用高于平均值的每个项目以及更多比它的平均成本。

到目前为止我的回答是

SELECT itemid, 
       description, 
       unitcost - AVG(unitcost) 
FROM Items 
WHERE unitcost > (SELECT AVG(unitcost) FROM Items)
  • 这会有用吗?根据我的理解,表达式允许在所选列的列表中,但我不确定是否扩展到使用AVG()等函数。
  • 是否有更清洁,更清晰的方式来表达同样的事情?最好只使用ISO SQL结构,因为我的课程相当理论化,不与任何特定的方言相关联。

谢谢朋友们:)

5 个答案:

答案 0 :(得分:2)

一个适用于几乎任何版本的SQL(接受显式JOIN语法)的查询都是:

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

答案 1 :(得分:1)

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

select itemid, 
       description, 
       unitcost - avg(unitcost) over() as delta 
from items 
where unitcost > (select avg(unitcost) from items);

SQLFiddle示例:http://sqlfiddle.com/#!12/cdb33/1

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这应该有效,但我不明白你为什么要做减法?

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)

答案 4 :(得分:0)

WITH clausa是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