Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Добрый вечер.
У меня есть таблица Phones в которой перечислены все телефоны и их имена
idName
1Iphome
2Xiaomi
3Meizu
4Xplay
5Samsung

Также у меня есть таблица покупок этих телефонов
IdOfPhone references PhonesPrice
134
244
138
176
255
234
344
323

Нужно вывести все телефоны цена которых больше средней среди таких же одним селектом
Я это сделал

select a.IdOfPhone,Price
from Buys a
right join Phones on Phones.Id=a.IdOfPhone
where Price>(select avg(Price)
             from Buys b
             where a.IdOfPhone=b.IdOfPhone)


Но мне нужно ,чтобы в таблице результата были также
4null
5null

Подскажите пожалуйста как это можно осуществить
10 ноя 16, 21:05    [19880900]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @phones table(id int,name varchar(30))
declare @buys table(phoneid int,price int)

insert @phones
values(1,'Iphome'),
(2,'Xiaomi'),
(3,'Meizu'),
(4,'Xplay'),
(5,'Samsung')

insert @buys
values(1,34),
(2,44),
(1,38),
(1,76),
(2,55),
(2,34),
(3,44),
(3,23)

select id,price from(
select p.id,b.price
,avg(price) over(partition by p.id) as avg_price
from @phones p
left join @buys b on p.id = b.phoneid 
) a
where price>avg_price or price is null
11 ноя 16, 02:16    [19881471]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
3unknown,

Спасибо
11 ноя 16, 10:31    [19881885]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
LazzyMind,

К Вашему запросу добавьте тех, которых нет, с помощью UNION ALL и фильтра NOT EXISTS ().
11 ноя 16, 10:59    [19882024]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Владислав Колосов,

К сожалению union добавит ещё один запрос,а мне больше одного по условию задачи нельзя.
11 ноя 16, 20:22    [19884802]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
LazzyMind
Владислав Колосов,

К сожалению union добавит ещё один запрос
С сего вы это взяли?
11 ноя 16, 20:27    [19884808]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич,

Посмотрел пару ссылок про union и вот ,что там примерно говорят:
В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих строк. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах.

Поправьте в чем не прав
11 ноя 16, 20:37    [19884836]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
LazzyMind
Гавриленко Сергей Алексеевич,

Посмотрел пару ссылок про union и вот ,что там примерно говорят:
В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих строк. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах.

Поправьте в чем не прав
Как может два запроса возвращать один рекордсет и иметь один план выполнения на двоих?
11 ноя 16, 20:43    [19884853]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич,

Честно говоря , ввиду своих не особо больших знаний (можно судить по моим вопросам на форуме)ваш вопрос я не понял.
11 ноя 16, 20:53    [19884878]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
LazzyMind,

У меня лишь задача выполнить запрос одним селектом (подзапросы возможны)

Смотрю на union, что был мне предложен и вижу например

SELECT snum, sname 
                     FROM Salespeople 
                     WHERE city = 'London' 
 
                     UNION 
 
SELECT cnum, cname 
                     FROM Customers 
                     WHERE city = 'London'; 


два запроса
11 ноя 16, 20:58    [19884892]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
LazzyMind
Гавриленко Сергей Алексеевич,

Честно говоря , ввиду своих не особо больших знаний (можно судить по моим вопросам на форуме)ваш вопрос я не понял.
Ок, давайте на простом. Если вылить одно ведро в таз, получится один таз воды. Если вылить два ведра в один таз, то все равно получается один таз воды.
11 ноя 16, 20:59    [19884898]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич,

все верно
11 ноя 16, 21:01    [19884905]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 119
LazzyMind
У меня лишь задача выполнить запрос одним селектом (подзапросы возможны)


Тогда не мучайтесь и поднимите ваше дополнительное условие из WHERE в условие соединения таблиц.
Вот так будет выглядеть ваш же запрос:
select Phones.Id,Price
from Buys a
right join Phones on Phones.Id=a.IdOfPhone and
    Price>(select avg(Price)
             from Buys b
             where a.IdOfPhone=b.IdOfPhone)


Внешние соединения не имеют смысла, если вы потом в условии WHERE убиваете те записи, которые
11 ноя 16, 21:03    [19884914]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с агрегатными функциями  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Sybex,
Спасибо
Учиться еще мне и учиться
11 ноя 16, 21:08    [19884919]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить