2010-09-01 81 views
0

我正在使用遊標。我想創建一個光標來顯示每個客戶的信息以及他已經購買的產品。爲此目的,我寫了如下光標:幫助完成遊標

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+' '[email protected]+' '[email protected]+' '+CAST(@Total as varchar) 
      fetch next from myCursor into @CustomerID, @ContactName , @ProductName, @Total 
    end 
    end 

現在它顯示每個客戶購買每件產品的次數。現在我想使用條件關鍵字,如IN,CONTAIN或EXISTS來完成我的光標以顯示每個客戶已購買的產品。但我不知道這樣做。你能幫我嗎?

+0

爲什麼你想用光標來做到這一點? – 2010-09-01 10:50:16

回答

0

如果我理解正確,您正在尋找顯示每個客戶最購買的產品。使用你的光標,你可以先聲明表變量如

declare @customersprocessed table 
(
    @CustomerID 
) 

那麼做到這一點,你需要通過SUM(Quantity) DESC訂購光標,使頂部的項目將上升到頂部。

最後,您需要修改查詢的內部部分,以便僅在客戶ID尚未存在於表中時纔打印,然後將customerid添加到表中,以免再次打印。

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

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

這當然是假設你想保持遊標。還有其他方法可以使用您想要展示的所有客戶的選擇以及返回最多購買產品的子查詢來完成此操作。