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

Откуда:
Сообщений: 10
Добрый вечер.
Не подскажете, как исправить ошибку?

SELECT     
Purchasing.Vendor.Name AS VendorName, 
Production.Product.Name AS PruductName,
min(Purchasing.ProductVendor.LastReceiptCost) AS LastReceiptCost 
FROM Production.Product 
INNER JOIN Purchasing.ProductVendor 
ON Production.Product.ProductID = Purchasing.ProductVendor.ProductID 
INNER JOIN Purchasing.Vendor 
ON Purchasing.ProductVendor.VendorID = Purchasing.Vendor.VendorID
GROUP BY Purchasing.Vendor.Name
ORDER BY Purchasing.Vendor.Name

Ошибка:
Столбец "Production.Product.Name" недопустим в списке выборки, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Если закоментировать "Production.Product.Name AS PruductName", то все работает верно, но не полно.
Если добавить Production.Product.Name в GROUP BY, то он выводит все названия, а надо только те, которые удовлетворяют условию.
PS Задание: Вывести поставщиков, цену, товары, при условии, что товар имеет минимальную цену у этого поставщика.

Спасибо.
17 дек 09, 18:47    [8082941]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
П-Л
Guest
Сделайте любой агрегат по Production.Product.Name и внесите его в GROUP BY
17 дек 09, 18:51    [8082956]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
lookid
при условии, что товар имеет минимальную цену у этого поставщика.
Это как понимать?
Вывести самые дешевые товары по каждому поставщику?
Или вывести по каждому товару поставщика, у которого наименьшая цена на этот товар ?

Да, и версию огласите, пожалуйста
17 дек 09, 18:57    [8082973]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
lookid
Member

Откуда:
Сообщений: 10
Паганель
lookid
при условии, что товар имеет минимальную цену у этого поставщика.
Это как понимать?
Вывести самые дешевые товары по каждому поставщику?
Или вывести по каждому товару поставщика, у которого наименьшая цена на этот товар ?

Да, и версию огласите, пожалуйста

Сервер SQL Server 2005 express, база AdventureWorks.
автор
Вывести самые дешевые товары по каждому поставщику?
- да.
17 дек 09, 19:03    [8082999]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Уникальна ли комбинация полей ProductID и VendorID
в таблице Purchasing.ProductVendor ?

Другими словами, может ли один и тот же товар быть указан у одного и того же поставщика
дважды?
17 дек 09, 19:09    [8083023]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
SELECT TOP 1 WITH TIES
    Purchasing.Vendor.Name AS VendorName, 
    Production.Product.Name AS PruductName,
    Purchasing.ProductVendor.LastReceiptCost AS LastReceiptCost 
FROM Production.Product 
    INNER JOIN Purchasing.ProductVendor 
        ON Production.Product.ProductID = Purchasing.ProductVendor.ProductID 
    INNER JOIN Purchasing.Vendor 
        ON Purchasing.ProductVendor.VendorID = Purchasing.Vendor.VendorID
ORDER BY ROW_NUMBER () OVER (partition by Purchasing.Vendor.Name ORDER BY Purchasing.ProductVendor.LastReceiptCost)
17 дек 09, 19:15    [8083044]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
lookid
Member

Откуда:
Сообщений: 10
Паганель,
ммм... нет, вроде.
17 дек 09, 19:18    [8083051]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Тогда вариант, предложенный пак и пак, Вам подходит
Ну еще свою сортировку добавите
Надеюсь, у Вас имена поставщиков уникальны

Ну или еще так можете попробовать...
select v.Name as VendorName
      ,p.Name as ProductName
      ,pv.LastReceiptCost as LastReceiptCost 
  from Production.Product as p
  join Purchasing.ProductVendor as pv on p.ProductID = pv.ProductID 
  join Purchasing.Vendor as v on pv.VendorID = v.VendorID
 where not exists (select *
                     from Purchasing.ProductVendor as pe
                    where pe.VendorID = v.VendorID
                      and pe.LastReceiptCost < pv.LastReceiptCost)
 order by VendorName
ЗЫ не проверял
17 дек 09, 19:21    [8083058]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
lookid
Member

Откуда:
Сообщений: 10
Всем спасибо.
Вариант пак и пак верный, вроде.
Паганель, у Вас проскакивают повторения поставщиков.
Если есть другие варианты, то буду рад их увидеть.
17 дек 09, 19:42    [8083110]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
lookid
Паганель, у Вас проскакивают повторения поставщиков.
А разве не должны?
Если у одного поставщика будет два товара с одинаковой ценой,
и эта цена минимальная среди всех товаров этого поставщика,
то как раз и будут "повторения поставщиков"
То есть будут выведены оба товара этого поставщика, потому как оба отвечают условию Вашей задачи
18 дек 09, 10:34    [8084840]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить