2

Webサイトhttp://www.sql-ex.ru/でSQLクエリについて質問がありました。クエリは以下を要求します:

メーカーAが製造したPCとラップトップの平均価格を定義します。

データベーススキーマは次のとおりです。

Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

私は自分のクエリを次のように書きました:

SELECT AVG(t.k) AS Avg_Price
FROM
  (SELECT AVG(A.price) AS k
    FROM PC A 
  JOIN Product B ON(A.model=B.model)
  WHERE B.maker='A'
  UNION ALL
  SELECT AVG(C.price) AS k
     FROM Laptop C
  JOIN PRODUCT D ON(C.model=D.model)
  WHERE D.maker='A') AS t

問題は、正解が返されないことです。返される平均は予想よりはるかに高いです。平均の計算方法が間違っていますか?期待される答えを返すようにクエリを変更するにはどうすればよいですか?どんな助けでもいただければ幸いです。

ありがとう

4

11 に答える 11

4

PCの価格とラップトップの価格を別々に平均してから、平均を一緒に平均します。サブクエリの価格を平均化するべきではなかったことを除いて、クエリは良好でした。サブクエリで価格を返し、トップレベルで平均するだけです。

select
    AVG( Price ) Avg_Price
from
(
    (
        select
            pc.Price
        from
            PC pc
            join Produt prod
             on pc.Model = prod.Model
        where
            prod.Maker = 'A'
    )
    union all
    (
        select
            pc.Price
        from
            Laptop l
            join Produt prod
             on l.Model = prod.Model
        where
            prod.Maker = 'A'
    )
) q
于 2013-03-27T06:10:03.953 に答える
3
SELECT AVG(datatable.price) FROM
(
(SELECT PC.Price FROM PC INNER JOIN Product p1 ON PC.model=P1.model     
     WHERE P1.maker='A') 
UNION ALL 
(SELECT Laptop.price FROM Laptop INNER JOIN Product p2 ON 
    Laptop.model=P2.model WHERE P2.maker='A')
) datatable

右。

クエリの結果:

Avg_Price

754.1666

于 2014-02-20T08:13:43.183 に答える
2

あなたの質問は間違っています。これは通常、分散システムで集約する方法に似ています。分散ノードで集計を実行してから、集計データを元に戻し、データを返す上で集計を実行できます。ただし、集計が転送可能である場合を除きます。AVGは取引できません。(1 + 2 + 3 + 4 + 5)/ 5 <>((1 + 2)/ 2 +(1 + 2 + 3)/ 3)

于 2013-03-27T06:09:14.620 に答える
1
with t1 as
(SELECT price, type from pc left join product on product.model = pc.model where maker = 'A'
UNION ALL
SELECT price, type from laptop left join product on product.model = laptop.model where maker = 'A')
select avg(price) from t1
于 2016-10-14T10:09:01.053 に答える
1

それも機能します

SELECT Avg(price) AS avg_price
FROM   (SELECT pc.price
        FROM   pc
               INNER JOIN product
                       ON pc.model = product.model
        WHERE  maker = 'A'
        UNION ALL
        SELECT laptop.price
        FROM   laptop
               INNER JOIN product
                       ON laptop.model = product.model
        WHERE  maker = 'A') Any_name 
于 2019-05-03T06:28:20.427 に答える
0
SELECT AVG(resultList.Price)
FROM
    (
        SELECT  a.Price
        FROM    PC a INNER JOIN Product B 
                    on a.Model = B.Model
        WHERE   B.Maker = 'A'
        UNION ALL
        SELECT  c.Price
        FROM    Laptop c INNER JOIN Product d 
                    on c.Model = d.Model
        WHERE   d.Maker = 'A'
    ) resultList
于 2013-03-27T06:13:21.547 に答える
0
select AVG(P.price) as avg_price
from
(
 select price, model from PC
 UNION ALL
 select price, model from Laptop
) P
join Product ON P.model = Product.model
where maker = 'A'
于 2015-10-08T09:34:08.863 に答える
0

SELECT AVG(price) FROM 
(
     SELECT PC.price, Product.maker FROM PC JOIN Product ON(PC.model=Product.model)
     UNION ALL
     SELECT Laptop.price, Product.maker FROM Laptop JOIN Product ON (Laptop.model = Product.model)
) T 
GROUP BY T.maker HAVING T.maker = 'A'

最初にすべてのラップトップとPCの価格を選択し、次にmaker ='A'のレコードのみを選択し、最後のステップで平均価格をカウントするため、これは機能します。

于 2018-05-07T17:55:02.827 に答える
0
Select avg(price) from
       ((select price,model  from pc 
       union all
       select price,model from laptop) a inner join  product on product.model=a.model and product.maker='A' )

第一に、私と両方のテーブルの方が良いと思いますunion price。その後、メーカーAからmodel見つけることができます。average(price)

于 2019-02-24T11:58:49.307 に答える
0

私は常にJOINS(個人的に)と非常に苦労しているので、結合せずにこのソリューションを試してください。IN演算子を使用する

with cte as (
    SELECT price, model, code 
    FROM pc 
    WHERE model 
    IN (SELECT model FROM product WHERE maker = 'A')
UNION
    SELECT price, model, code 
    FROM laptop 
    WHERE model 
    IN (SELECT model FROM product WHERE maker = 'A')
)

SELECT AVG(price) FROM cte
于 2020-07-17T05:20:12.637 に答える
-1
select avg(price) as avg_price from
(select price
from Product, PC
where Product.model = PC.model
and maker = 'A'
union all
select price
from Product, Laptop
where Product.model = Laptop.model
and maker='A') avg_price 
于 2019-05-03T06:32:19.473 に答える