Помогите завершить курсор - PullRequest
       13

Помогите завершить курсор

0 голосов
/ 01 сентября 2010

Я работаю над курсорами.Я хочу создать курсор для отображения информации о каждом клиенте и продукте, который он приобрел больше.Для этой цели я написал следующий курсор:

declare myCursor cursor
 for select Customers.CustomerID, Customers.ContactName, Products.ProductName, SUM(Quantity) as Total
  from Customers inner join Orders on Customers.CustomerID = Orders.CustomerID
 inner join( [Order Details] inner join Products on [Order Details].ProductID = Products.ProductID)
 on Orders.OrderID = [Order Details].OrderID
 group by Customers.CustomerID, Customers.ContactName, Products.ProductName
 --
 declare @CustomerID nchar(10), @ContactName nvarchar(30), @ProductName nvarchar(4), @Total int
 open myCursor
 fetch next from myCursor into @CustomerID, @ContactName , @ProductName, @Total
 while @@FETCH_STATUS = 0
     begin

     begin
          print @CustomerID+' '+@ContactName+' '+@ProductName+' '+CAST(@Total as varchar)
          fetch next from myCursor into @CustomerID, @ContactName , @ProductName, @Total
     end
     end

Теперь он показывает, сколько раз каждый покупатель покупал каждый продукт.Теперь я хочу использовать ключевые слова условия, такие как IN, CONTAIN или EXISTS, чтобы завершить курсор и отобразить продукт, который каждый клиент приобрел больше.Но я понятия не имею, чтобы сделать это.Не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 02 сентября 2010

Если я правильно понимаю, вы хотите показать продукт, который каждый покупатель приобрел больше всего. Используя курсор, вы могли бы сделать это, сначала объявив переменную таблицы, такую ​​как

declare @customersprocessed table
(
  @CustomerID
)

Затем вам нужно упорядочить курсор по SUM(Quantity) DESC, чтобы верхние элементы поднимались до верха.

Наконец, вам нужно будет изменить их внутреннюю часть запроса, чтобы они печатались только в том случае, если идентификатор клиента еще не существует в таблице, а затем добавить параметр Customerid в таблицу, чтобы он больше не печатался. *

 begin
      if ((select count(1) from @customersprocessed where CustomerID = @CustomerID) = 0)
      begin
         print @CustomerID+' '+@ContactName+' '+@ProductName+' '+CAST(@Total as varchar)
      end
      else
      begin
         insert into @customersprocessed select @CustomerID
      end

      fetch next from myCursor into @CustomerID, @ContactName , @ProductName, @Total
 end

Это, конечно, предполагает, что вы хотите удерживать курсор. Были бы другие способы сделать это, используя выбор всех клиентов, которых вы хотели показать, и подзапрос, который вернул наиболее купленный продукт.

...