Упражнение 26

Найдите среднюю цену ПК и ноутбуков, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена

Решение 1.18.1

SELECT AVG(av.p) AS avg_price
FROM (SELECT AVG(price) p
        FROM Product m, PC
        WHERE m.model = PC.model 
            AND maker = 'A'
        UNION
        SELECT AVG(price) p
        FROM Product m, Laptop l
        WHERE m.model = l.model 
            AND maker = 'A'
        ) AS av;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

В подзапросе предложения FROM для производителя А объединяются средние цены на ПК и ноутбуки, после чего в основном запросе вычисляется среднее этих средних значений. Ошибка чисто арифметическая, которая заключается в том, что общее среднее значение (которое и нужно посчитать) не равно в общем случае среднему от средних значений.

Решение 1.18.2

SELECT ((SELECT SUM(price)
        FROM Product 
            INNER JOIN PC ON Product.model = PC.model
        WHERE maker='A'
        )
        +
        (SELECT SUM(price)
        FROM Product 
            INNER JOIN  Laptop ON Product.model = Laptop.model
        WHERE maker='A'
        )
        ) / ((SELECT COUNT(price)
            FROM Product 
                INNER JOIN PC ON Product.model = PC.model
            WHERE maker='A'
            )
            +
            (SELECT COUNT(price)
            FROM Product 
                INNER JOIN Laptop ON Product.model = Laptop.model
            WHERE maker='A'
            )
            ) as AVG_price;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Во втором решении сумма цен ПК и ноутбуков делится на их общее количество. С точки зрения математики все правильно. Но с точки зрения SQL — нет. Дело в том, что если в базе данных нет ПК (или ноутбуков), которые выпускал бы производитель А, то функция COUNT вернет значение 0 (что согласуется с математическими представлениями), а вот функция SUM вернет NULL-значение. В результате чего суммарная цена окажется равной NULL, а не суммарной цене имеющейся продукции другого типа, что хотелось бы получить.

ПиР

Решить задачу на SQL-EX.RU