0

SQLPLUSのクエリの1つに問題があります。

次の制約を満たすすべてのサプライヤに対して、SuppCode、SuppName、およびPostCodeを表示するように依頼されました。サプライヤが提供するすべての在庫アイテムの価格は、すべての在庫アイテムの平均よりも高くなっています。

私が使用している3つのテーブルは次のとおりです。サプライヤーと在庫およびSupplyItems。

サプライヤテーブルは次のようになります。

SUPPCODE SUPPNAME STREET TOWN COUNTRY POSTCODE TELNO FAXNO

8つの個別のサンプルデータ(8つのサプライヤ)があり、ヌルフィールドはありません。

Stocksテーブルは次のようになります。

ITEMNO STORECODE ITEMDESC QUANTITY UNITS REORDER PRICE SUPPCODE

40個の個別のサンプルデータ(40個の在庫アイテム)があり、ヌルフィールドはありません。

SupplyItemsテーブルは次のようになります。

SUPPCODE CATNO STOCKNO PRICE

60個の個別のサンプルデータ(60個の供給アイテム)があり、ヌルフィールドはありません。

私は次のクエリを書きました:

select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
LEFT JOIN SupplyItems SI ON SU.SuppCode = SI.SuppCode
where Price >
(select AVG(Quantity) from Stocks ST
where SI.StockNo = ST.StockNo);

次の出力(4つの値)が得られます。

SUPPCODE SUPPNAME POSTCODE
S6       BSS LTD. B10 8SS
S2       ITX LTD. IT5 3TX
S3       FFG LTD. FY9 6FG
S4       OMM LTD. OM5 4MM

これで、出力に2つまたは3つのレコードが含まれるはずであることがわかったので、理由はわかりませんが、クエリが間違っています。

どんな助けでもいただければ幸いです。

4

1 に答える 1

1

これ:

where Price >
(select AVG(Quantity) from Stocks ST

間違っているように見えます-むしろそうではありません

AVG(price)

編集:また、

select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
LEFT JOIN SupplyItems SI ON SU.SuppCode = SI.SuppCode
where Price > ...

おそらくあなたが望むことをしません-これは平均より高い価格の少なくとも1つのアイテムを提供するすべてのサプライヤーを返します。平均より高い価格のアイテムのみを提供するサプライヤーを取得するには、別のアプローチを使用する必要があります。

select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
where not exists (
  select null from SupplyItems si 
  where su.SuppCode = si.SuppCode
  and su.price <= (
      select AVG(price) from Stocks ST
      where SI.StockNo = ST.StockNo)
)
于 2012-11-29T08:25:19.670 に答える