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

Откуда:
Сообщений: 266
Добрый день.
При выполнении запроса:

SELECT TOP 20 
p.id_price as p_id_price, 
p.id_service as p_id_service, 
p.name as p_name, 
p.name_original as p_name_original, 
p.id_producer_country as p_id_producer_country, 
p.id_firm as p_id_firm, 
f.name as f_name, 
f.address as f_address, 
f.phone as f_phone, 
city.name as city_name, 
pc.name as pc_name 
FROM Price p 
left join Firm f on f.id_service=p.id_service AND f.id_city=p.id_city AND f.id_firm=p.id_firm 
left join City city on city.id_city = p.id_city 
left join Producer_country pc on pc.id_producer_country = p.id_producer_country 
WHERE 
p.id_city='73041' AND p.include='1' AND p.blocked='0' AND f.blocked='0' 
AND ( f.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS OR p.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS ) 
GROUP by p.id_firm ORDER BY p.name ASC



получаю ошибку:

Msg 8120, Level 16, State 1, Line 2
Column 'Price.id_price' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


Подскажите в чем проблема и как в данном запросе использовать GROUP by p.id_firm правильно ?
27 фев 13, 21:11    [13991120]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Подскажите в чем проблема


Нельзя вот так вот просто взять и написать GROUP BY <что-то>, и перечислить в SELECT листе остальные поля без каких либо агрегатных функций.

автор
как в данном запросе использовать GROUP by p.id_firm правильно ?


Рекомендации по оформлению сообщений в форуме п.6
27 фев 13, 21:18    [13991136]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
Amateur7
как в данном запросе использовать GROUP by p.id_firm правильно ?

обернуть все остальные поля в агрегатные функции
27 фев 13, 21:20    [13991142]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Amateur7,

кроме всего прочего
WHERE ... AND f.blocked='0'...
превращает
left join Firm f
в
inner join Firm f
27 фев 13, 21:45    [13991184]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Baddy,
Из источника:
Агрегатные функции выполняют вычисление на наборе значений и возвращают одиночное значение. Агрегатные функции, за исключением COUNT, не учитывают значения NULL. Агрегатные функции часто используются в выражении GROUP BY инструкции SELECT.

Подскажите, а как их использовать(можно даже на каком - нибудь левом примере)?
т.к. впервые столкнулся и немного непонятно..
27 фев 13, 21:45    [13991187]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Amateur7
Подскажите, а как их использовать(можно даже на каком - нибудь левом примере)?


Будет лучше, если вместо "левого примера" Вы озвучите конкретную задачу.
27 фев 13, 21:53    [13991203]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

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

Есть запрос на выборку определенных данных:

SELECT TOP 20 
p.id_price as p_id_price, 
p.id_service as p_id_service, 
p.name as p_name, 
p.name_original as p_name_original, 
p.id_producer_country as p_id_producer_country, 
p.id_firm as p_id_firm, 
f.name as f_name, 
f.address as f_address, 
f.phone as f_phone, 
city.name as city_name, 
pc.name as pc_name 
FROM Price p 
left join Firm f on f.id_service=p.id_service AND f.id_city=p.id_city AND f.id_firm=p.id_firm 
left join City city on city.id_city = p.id_city 
left join Producer_country pc on pc.id_producer_country = p.id_producer_country 
WHERE 
p.id_city='73041' AND p.include='1' AND p.blocked='0' AND f.blocked='0' 
AND ( f.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS OR p.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS ) 
ORDER BY p.name ASC


Этим запросом мы осуществляем выборку данных из таблиц где f.name или p.name содержат слово поиска.
в настоящий момент стала задача сделать так, чтобы из всех результатов, выводился лишь один результат по каждой фирме, а не все возможные варианты.

Для этого была предпринята попытка использования GROUP by p.id_firm, но в итоге я получаю ошибку...
Вот в принципе и вся задача...

P.S.: как правильно заметил iap вместо left join Firm следует использовать inner join Firm...
27 фев 13, 22:35    [13991326]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
все равно какой из результатов по фирме?
28 фев 13, 01:52    [13991811]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

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

Наиболее актуальный(т.е. который наиболее подходит под условия)...
P.s.: но можно и не наиболее актуальный.
28 фев 13, 08:15    [13992017]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Amateur7
Наиболее актуальный(т.е. который наиболее подходит под условия)...

Озвучьте критерий "наибольшей подходящести под условия".
Вот у вас в WHERE написаны различные условия. Пусть запрос выдал несколько записей по одной и той же фирме. И все они подходят под условия из WHERE (а как же иначе). По какому критерию из них следует выбрать наиболее подходящий?
28 фев 13, 09:55    [13992301]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Гость333
Amateur7
Наиболее актуальный(т.е. который наиболее подходит под условия)...

Озвучьте критерий "наибольшей подходящести под условия".
Вот у вас в WHERE написаны различные условия. Пусть запрос выдал несколько записей по одной и той же фирме. И все они подходят под условия из WHERE (а как же иначе). По какому критерию из них следует выбрать наиболее подходящий?


Извините, неправильно сформулировал мысль - в данном случае нужно выбрать верхнее значение, т.е. SELECT Top 1 по каждой фирме.
28 фев 13, 15:42    [13994780]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Amateur7
верхнее значение, т.е. SELECT Top 1 по каждой фирме.

Верхнее по какому критерию сортировки?
28 фев 13, 15:51    [13994859]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Гость333
Amateur7
верхнее значение, т.е. SELECT Top 1 по каждой фирме.

Верхнее по какому критерию сортировки?



По имени продукта, т.е. Order by p.name ASC
Например выдается несколько вариантов по каждой фирме в порядке Order by p.name ASC, из этих значений нужно выбрать первую строку(1-й вариант) по каждой фирме(GROUP by p.id_firm).
28 фев 13, 21:55    [13996303]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
_ч_
Member

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

Что-то вроде такого, я полагаю

select top 1 with ties N,  p.name, Id_firm from(
select Id_firm, p.name, ROW_NUMBER() OVER (PARTITION BY IdMark ORDER BY p.name ASC) as N from Price p
)Result order by N
1 мар 13, 09:29    [13997344]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Это возможно или нет?
1 мар 13, 11:18    [13997947]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
_ч_
Amateur7,

Что-то вроде такого, я полагаю

select top 1 with ties N,  p.name, Id_firm from(
select Id_firm, p.name, ROW_NUMBER() OVER (PARTITION BY IdMark ORDER BY p.name ASC) as N from Price p
)Result order by N
Подзапрос вообще не нужен:
select top 1 with ties *
from Price
order by ROW_NUMBER() OVER (PARTITION BY IdMark ORDER BY p.name);
1 мар 13, 11:39    [13998105]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
_ч_
Member

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

Вы правы, как всегда. Это у меня дурацкая привычка
1 мар 13, 11:53    [13998189]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
_ч_
Member

Откуда:
Сообщений: 1432
Amateur7
Это возможно или нет?


А Вы хоть проверили мой запрос?
1 мар 13, 11:54    [13998198]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
_ч_,

сорри, не обноил страницу и не увидел новый ответ, спасибо.

Однако у меня вопрос - честно говоря вперые вижу такого рода запрос:

select top 1 with ties *
from Price
order by ROW_NUMBER() OVER (PARTITION BY IdMark ORDER BY p.name);


есть ли возможность у кого-нибудь объяснить как применить его к моему запросу?
1 мар 13, 23:25    [14001746]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34758
Блог
Amateur7,

вам сложно открыть msdn и посмотреть, что есть что?
1 мар 13, 23:35    [14001806]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Критик,

я бы вряд ли спросил если бы нашел все)
3 мар 13, 05:46    [14004809]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с GROUP by на MSSQL 2008  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Спасибо всем за помощь, вопрос решен.
3 мар 13, 05:47    [14004810]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить