Текст задания:
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква).
Вывести: одна общая средняя цена.
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем 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.
Стоимость: 0.026801599189639.
Количество операций: 9.
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'
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
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
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
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
огонь
Удалитьдля чего в подзапросе выводить столбец CODE и почему без него выводит на строку меньше?
Удалить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')
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
не могу понять почему нельзя написать просто union? почему union all?
УдалитьЕсли не проставить ALL, то затираются дубликаты (одинаковые цены) и среднее уже посчитается на урезанном срезе
Удалить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
Самое короткое решение которое нашел
Вставлю свои 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 у производителя А