首页 > 技术文章 > 游标+递归 查询 客户 子客户 查询财务信用

zhaojingwei 2015-07-20 08:39 原文

USE [CRM01]
GO
/****** Object:  StoredProcedure [dbo].[Account3YearsTrade]    Script Date: 07/15/2015 08:34:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Batch submitted through debugger: SQLQuery1.sql|7|0|C:\Users\crmqas2\AppData\Local\Temp\3\~vs3E13.sql
ALTER PROCEDURE  [dbo].[Account3YearsTrade] as 
DECLARE @AccountId UNIQUEIDENTIFIER ,
    @yt_total_price money ,
    @OpportunityId UNIQUEIDENTIFIER ,
    @yt_invoice_date int ,
    @yt_lastyeartrading money ,
    @yt_toptwoannualturnover money ,
    @yt_topthreeannualturnover money ,
    @nowdate int 
    --声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同  
DECLARE mycursor CURSOR
FOR
    select accountid from accountBase WHERE StateCode=0 
    SELECT @nowdate=DATEPART(year,Getdate())
--打开游标  
OPEN mycursor      
    --从游标里取出数据赋值到我们刚才声明的2个变量中  
FETCH NEXT FROM mycursor INTO @AccountId
    --判断游标的状态  
    -- 0 fetch语句成功      
    ---1 fetch语句失败或此行不在结果集中      
    ---2 被提取的行不存在  
	WHILE ( @@fetch_status = 0 ) 
		BEGIN 
			set @yt_lastyeartrading = 0
			set @yt_toptwoannualturnover = 0
			set @yt_topthreeannualturnover = 0
			DECLARE mycursortwo CURSOR
			FOR   
			  WITH childAccount(accountid,ParentAccountId) as 
			   ( 
				SELECT accountid,ParentAccountId FROM AccountBase WHERE accountid=@AccountId
				UNION ALL 
				SELECT A.accountid,A.ParentAccountId FROM AccountBase A,childAccount b 
				where a.ParentAccountId = b.accountid 
			   )
				select yt_total_price,DATEPART(year,yt_invoice_date),OpportunityId from Opportunity
				where yt_arrive in(SELECT accountid  from childAccount)   and yt_status=100000002
			    open mycursortwo    
				FETCH NEXT FROM mycursortwo INTO @yt_total_price,@yt_invoice_date,@OpportunityId
				while( @@fetch_status = 0 )
					begin
						if(@yt_invoice_date=@nowdate-1)
							begin
								set @yt_lastyeartrading = @yt_lastyeartrading + isnull(@yt_total_price,0.0000)
							end
						else if(@yt_invoice_date=@nowdate-2)
							begin
								set @yt_toptwoannualturnover = @yt_toptwoannualturnover + isnull(@yt_total_price,0.0000)
							end
						else if(@yt_invoice_date=@nowdate-3)
							begin
								set @yt_topthreeannualturnover = @yt_topthreeannualturnover + isnull(@yt_total_price,0.0000)
							end
				FETCH NEXT FROM mycursortwo  INTO @yt_total_price,@yt_invoice_date,@OpportunityId
					end
		   CLOSE mycursortwo
		   DEALLOCATE mycursortwo
		   update Account
		   set yt_lastyeartrading = @yt_lastyeartrading,yt_lastyeartrading_Base = @yt_lastyeartrading,yt_toptwoannualturnover = @yt_toptwoannualturnover,
			   yt_toptwoannualturnover_Base = @yt_toptwoannualturnover,yt_topthreeannualturnover = @yt_topthreeannualturnover,yt_topthreeannualturnover_Base = @yt_topthreeannualturnover
		   where  AccountId = @AccountId
		   
		   --用游标去取下一条客户  
		   FETCH NEXT FROM mycursor  INTO @AccountId
		END  
    --关闭游标  
CLOSE mycursor  
    --撤销游标  
DEALLOCATE mycursor   

  

推荐阅读