пятница, 7 марта 2014 г.

Задание: 26

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

SELECT AVG(price)
FROM (
SELECT code, price, pc.model, ram, hd
FROM pc
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
UNION
SELECT code, price, laptop.model, ram, hd
FROM laptop
WHERE model IN (
SELECT model
FROM product
WHERE maker='a'
)
) a;
Анализ плана выполнения запроса:
Стоимость: 0.026801599189639.
Количество операций: 9.

13 комментариев:

  1. SELECT AVG(price) AS AVG_price FROM (SELECT model, price FROM PC
    UNION ALL
    SELECT model, price FROM Laptop) AS price
    INNER JOIN Product AS p
    ON price.model = p.model
    WHERE maker = 'A'

    ОтветитьУдалить
  2. Select avg(t1.price) as avgprice from (select pc.price from pc
    join product on product.model=pc.model
    where product.maker='A'
    union all
    select laptop.price from laptop
    join product on product.model=laptop.model
    where product.maker='A') t1, product

    ОтветитьУдалить
  3. WITH JOIN_TAB AS
    (
    SELECT MAKER, PRICE
    FROM PC
    INNER JOIN Product
    ON Product.MODEL=PC.MODEL
    WHERE MAKER = 'A'
    UNION
    SELECT MAKER, PRICE
    FROM LAPTOP
    INNER JOIN Product
    ON Product.MODEL=LAPTOP.MODEL
    WHERE MAKER = 'A'
    )
    select AVG(PRICE) AS AVG_PRICE
    FROM JOIN_TAB

    ОтветитьУдалить
  4. WITH JOIN_TAB AS (
    SELECT MAKER, PRICE, TYPE
    FROM PC
    INNER JOIN Product
    ON Product.MODEL=PC.MODEL
    WHERE MAKER = 'A'
    union all
    SELECT MAKER, PRICE, TYPE
    FROM laptop
    INNER JOIN Product
    ON Product.MODEL=laptop.MODEL
    WHERE MAKER = 'A'
    )
    select AVG(PRICE) AS AVG_PRICE
    FROM JOIN_TAB

    ОтветитьУдалить
  5. SELECT
    AVG(price)
    FROM (
    --добавляем таблицу компьютеров
    SELECT
    price,code,PC.model
    FROM pc

    --оставляем компьютеры производителя 'A'
    WHERE model IN (
    SELECT model
    FROM product
    WHERE maker='a'
    )
    --соединяем таблицу компьютеров с таблицей ноутбуков
    UNION (
    SELECT
    price,code,Laptop.model
    FROM laptop
    WHERE model IN (
    SELECT model
    FROM product
    WHERE maker='a'
    )
    )
    ) a

    ОтветитьУдалить
    Ответы
    1. для чего в подзапросе выводить столбец CODE и почему без него выводит на строку меньше?

      Удалить
  6. select avg(price) as AVG_price
    from (
    select pc.model,pc.price from pc
    union all
    select lp.model,lp.price from laptop lp
    ) as price
    where model in (select p.model from product p
    where maker = 'A')

    ОтветитьУдалить
  7. select avg(price) as AVG_price
    FROM
    (select pc.price as price
    from product
    join pc on product.model=pc.model
    where maker = 'A'
    union all
    select laptop.price
    from product
    join laptop on product.model=laptop.model
    where maker = 'A') AS ap

    ОтветитьУдалить
    Ответы
    1. не могу понять почему нельзя написать просто union? почему union all?

      Удалить
    2. Если не проставить ALL, то затираются дубликаты (одинаковые цены) и среднее уже посчитается на урезанном срезе

      Удалить
  8. SELECT AVG(price) from (
    SELECT price
    FROM pc
    WHERE model IN (
    SELECT model
    FROM product
    WHERE maker='a'
    )
    UNION all
    SELECT price
    FROM laptop
    WHERE model IN (
    SELECT model
    FROM product
    WHERE maker='a'
    )
    )
    a
    Самое короткое решение которое нашел

    ОтветитьУдалить
  9. Вставлю свои 5 копеек

    with x as (
    select pc.price price
    from product p
    join pc on p.model = pc.model
    where maker = 'A'

    union all

    select l.price price
    from product p
    join laptop l on p.model = l.model
    where maker = 'A'
    )

    select avg(price)
    from x

    пошагово распишу в чем суть:

    1. конструкция with x as (...) дает на выходе две соединенные таблицы построчно с помощью оператора union all

    внутри мы попарно объединяем по две таблицы:
    - product и pc
    и
    - product и laptop

    далее у нас в CTE формируется таблица с ценами на оба вида продукции у производителя А

    2. далее для уже сформировавшейся таблицы мы задаем агрегатную функцию и получаем ОБЩУЮ среднюю сумму на laptop и pc у производителя А

    ОтветитьУдалить