我正在为数据库考试做一些修改,其中一个问题如下:
根据表Items
(列:itemid
,description
,unitcost
),制定查询以查找费用高于平均值的每个项目以及更多比它的平均成本。
到目前为止我的回答是
SELECT itemid,
description,
unitcost - AVG(unitcost)
FROM Items
WHERE unitcost > (SELECT AVG(unitcost) FROM Items)
AVG()
等函数。谢谢朋友们:)
答案 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