SQL-ex.ru #26 从两个表中选择平均值

问题描述 投票:0回答:12

我在网站 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

问题是它没有返回正确的答案。平均回报率远高于预期。是不是平均数的计算方式有误?如何更改查询以使其返回预期答案?任何帮助将不胜感激。

谢谢

sql join union
12个回答
4
投票

您分别计算个人电脑价格和笔记本电脑价格的平均值,然后将平均值合并在一起。您的查询很好,只是您不应该对子查询中的价格进行平均。只需返回子查询中的价格并在顶层求平均值即可:

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

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

对。

您查询的结果:

平均价格

754.1666


2
投票

您的查询有误。这通常就像如何在分布式系统上聚合一样。您可以在分布式节点上进行聚合,然后带回聚合数据并在返回数据之上进行聚合,除非聚合是可转移的。 AVG 不可转让。 (1+2+3+4+5)/5 <> ((1+2)/2 + (1+2+3)/3)


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

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 

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

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'

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'

它之所以有效,是因为首先您选择所有笔记本电脑和个人电脑价格,接下来您仅选择制造商=“A”的记录,最后一步是计算平均价格。


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
model
的话会更好,然后我们可以从制造商A那里找到
average(price)


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

0
投票
select avg(P.price) from 
(select pc.model as model,pc.price as price from PC pc 
union all 
select L.model as model,L.price as price from Laptop L ) P
where P.model in 
( select model from Product where maker = 'A' )

-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 
© www.soinside.com 2019 - 2024. All rights reserved.