0

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

给定表格Items(列:itemiddescriptionunitcost),制定一个查询来查找成本高于平均水平的每个项目,以及它的成本比平均水平高多少。

到目前为止我的回答是

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

谢谢朋友 :)

4

5 回答 5

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
于 2013-04-25T12:45:30.040 回答
1

在大多数 SQL 方言中,您可以为此使用窗口函数。也就是说,你可以有一个函数的partition子句avg()

SELECT itemid, 
       description, 
       unitcost - avgcost
FROM (select i.*, avg(unitcost) over () as avgcost
      from Items i
     ) i
WHERE unitcost > avgcost
于 2013-04-25T13:17:31.510 回答
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

于 2013-04-25T12:56:12.473 回答
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)
于 2013-04-25T12:39:20.833 回答
0

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

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
于 2013-04-25T12:40:04.657 回答