2013-03-27 76 views
1

我對網站http://www.sql-ex.ru/上的sql查詢有疑問。查詢請求 :SQL-ex.ru#26從兩個表中選擇平均值

定義由製造商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 

問題是,它不retu正確的答案。返回的平均數遠高於預期。平均值的計算方式是否錯誤?如何更改查詢以便返回預期的答案?任何幫助,將不勝感激。

謝謝

回答

3

您正在分別計算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 
+0

啊平均是不可轉讓的古納說。有意義 – Paul 2013-03-27 06:34:05

2

您的查詢是錯誤的。通常就像你如何在分佈式系統上進行聚合。您可以在分佈式節點上進行聚合,然後取回聚合數據,並在返回數據之前進行聚合,只有聚合可以轉移。 AVG不可轉義。 (1 + 2 + 3 + 4 + 5)/(1 + 2)/ 2 +(1 + 2 + 3)/ 3)

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 
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

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' 
+2

如果你在這裏添加一些解釋會更好! – 2015-10-08 09:42:31

0
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