0

データベース試験の修正を行っていますが、質問の 1 つは次のとおりです。

テーブル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 構文を受け入れる) で動作する 1 つのクエリは次のようになります。

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

元のクエリは、わずかな変更 (ウィンドウ関数を使用) で有効な (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 に答える
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 に答える
0

clausa は 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 に答える
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 に答える