Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > проблема с процедурой


Автор: 4ybaka 17.10.2007, 22:43
нужно написать процедуру,кот по указанному году выводит для каждого из продавцов самый дорогой заказ.всего выводится n(параметр) продавцов.рез-т сортируется по убыванию цены.еще нужно вывести номер заказа,что и вызвало проблему...у меня получилась такая вот процедура:
Код

GO
alter proc GreatestOrders
        @Year int,
        @Count int
AS
    select top (@Count)
        E.LastName + ' ' + E.FirstName as Seller,
        max(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) as Cost
    from Employees E,Orders O,"Order Details" OD
    where O.EmployeeID=E.EmployeeID and O.OrderID=OD.OrderID and datepart(year,O.OrderDate)=@Year
    group by E.LastName + ' ' + E.FirstName
    order by max(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) desc

но вот просто вывести O.OrderID нельзя,нужна группировка по этому полю,но если сгруппировать,то появятся ненужные записи(для продавца нельзя выводить более одного заказа)

Автор: Lunatikus 18.10.2007, 11:06
Ну,думаю,так:
Код

GO
alter proc GreatestOrders
        @Year int,
        @Count int
AS
SELECT t1.seller,t1.cost,t2.orderID FROM
    (select top (@Count)
        E.LastName + ' ' + E.FirstName as Seller,
        max(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) as Cost,
    from Employees E,Orders O,"Order Details" OD
    where O.EmployeeID=E.EmployeeID and O.OrderID=OD.OrderID and datepart(year,O.OrderDate)=@Year
    group by E.LastName + ' ' + E.FirstName) t1
    LEFT JOIN
    (select 
        OD.OrderID,
        E.LastName + ' ' + E.FirstName as Seller,
        OD.Quantity*OD.UnitPrice*(1-OD.Discount) as Cost
      from Employees E,Orders O,"Order Details" OD
      where O.EmployeeID=E.EmployeeID and O.OrderID=OD.OrderID and datepart(year,O.OrderDate)=@Year) t2
    ON  t1.seller=t2.seller AND t1.cost=t2.cost
    order by cost desc

Автор: 4ybaka 18.10.2007, 19:45
 smile +1
если кому-нибудь нужно,то вот скрипт после синтаксической обработки:
Код

GO
alter proc GreatestOrders
        @Year int,
        @Count int
AS
select top (@Count) t1.seller,t2.orderID,t1.cost from
    (select 
        E.LastName + ' ' + E.FirstName as Seller,
        max(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) as Cost
    from Employees E,Orders O,"Order Details" OD
    where O.EmployeeID=E.EmployeeID and O.OrderID=OD.OrderID and datepart(year,O.OrderDate)=@Year
    group by E.LastName + ' ' + E.FirstName) t1
    LEFT JOIN
    (select 
        OD.OrderID,
        E.LastName + ' ' + E.FirstName as Seller,
        OD.Quantity*OD.UnitPrice*(1-OD.Discount) as Cost
      from Employees E,Orders O,"Order Details" OD
      where O.EmployeeID=E.EmployeeID and O.OrderID=OD.OrderID and datepart(year,O.OrderDate)=@Year) t2
    on  t1.seller=t2.seller AND t1.cost=t2.cost
    order by t1.cost desc

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)