• With递归循环实现like功能(性能优化)


    函数:

    CREATE FUNCTION [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40] ( @DepID INT )   
    RETURNS TABLE   
    AS   
    RETURN   
        (   
    WITH    data   
              AS ( SELECT   dt.DepID ,   
                            dt.DepFatherID   
                   FROM     dbo.SysDepartment dt  WITH (NOLOCK)  
                   WHERE    dt.DepDelState = 1   
                            AND ( @DepID = -1   
                                  OR    
                                  dt.DepID = @DepID   
                                )   
                   UNION ALL   
                   SELECT   A1.DepID ,   
                            A1.DepFatherID   
                   FROM     dbo.SysDepartment A1    WITH ( INDEX ( 1 ) )   
                            INNER JOIN data b ON A1.DepFatherID = b.DepID   
                   WHERE    A1.DepDelState = 1   
                 )   
        SELECT  DepID DataID,   
                DepFatherID   
        FROM    data   
    )

    应用于存储过程(替代了like语句):

    /**********************************                                       
    --Author:YW                                       
    --CreateDate:2012-12-31                                     
    --Description:相关区域动态分析                                       
    ***********************************/                 
    CREATE PROCEDURE [dbo].[UP_XA_DynamicReport_AboutDepReport]   
        @CurrentUserID INT ,   
        @DeptLevel INT ,   
        @DepID INT ,   
        @SaleUserID INT ,   
        @CusType SMALLINT ,   
        @CustomerID INT ,   
        @ProTypeID INT ,   
        @ProductID INT ,   
        @HospitalID INT ,   
        @DateType INT ,--统计区间:6-按年 2-按月                 
        @StartTime DATETIME ,   
        @EndTime DATETIME ,   
        @SortField VARCHAR(100) ,   
        @SortMode VARCHAR(20) ,   
        @TopNum INT ,   
        @StatisticsPointer SMALLINT--统计指标 1.新增客户数 2.新进货客户数 3.新进产品数 4.新进终端数  5.新开发产品终端数                   
    AS    
        BEGIN                                                                     
            SET NOCOUNT ON ;                                                     
            DECLARE @sWhere NVARCHAR(MAX)           
            DECLARE @sSql NVARCHAR(MAX)                                                   
            DECLARE @sOrder NVARCHAR(200)                                                   
                                                                           
            SET @sWhere = '  '           
                 
            IF ( @CusType > -1 )    
                BEGIN                                                   
                    SET @sWhere = @sWhere + ' AND VCALM.CusType=@CusType '                                                   
                END                 
                     
            IF ( @CustomerID > -1 )    
                BEGIN                                                   
                    SET @sWhere = @sWhere + ' AND VCALM.CustomerID=@CustomerID '                                                   
                END                                                 
            IF ( @SortField = ''   
                 OR @SortField IS NULL   
                 OR @SortMode = ''   
                 OR @SortMode IS NULL   
               )    
                BEGIN                                                                   
                    SET @sOrder = N' B.TotalNum DESC '                                                                   
                END                                                  
            ELSE    
                BEGIN                                                     
                    SET @sOrder = N' ' + @SortField + ' ' + @SortMode + ''                                                            
                END                                                     
            IF ( @DateType = 6 )--按年(当年份一样时,只显示该年)                       
                BEGIN                       
                    DECLARE @str NVARCHAR(MAX)                       
                    SET @str = [dbo].[uf_getStr](@DateType, @StartTime, @EndTime)                     
                    IF ( @StatisticsPointer = 1 )--新增客户数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=VCALM.InUser) 
     
    --AND SD1.FathIDPath like SD.FathIDPath+'',%''
    AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID)'           
                     
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND VCALM.InUser=@SaleUserID '                                                   
                                END                 
               
                            SET @sSql = N'         
     WITH    DepTable         
              AS ( SELECT   SD.DepID AS UserID ,         
                            SD.DepName ,         
                            SD.DepPrincipal AS SaleUserName ,         
                            Num = CAST(( SELECT COUNT(CustomerID)         
                            FROM   dbo.VCustomerAndLinkManV20 VCALM         
            WITH ( NOLOCK )         
                                                LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
     WITH ( NOLOCK ) ON VCALM.InUser = VSDRU.UserID         
                                         WHERE  VCALM.CussState = 1         
                                                AND VCALM.CusDelState = 1         
                                                AND VCALM.InDate >= DF.BeginDate         
                                                AND VCALM.InDate < DF.EndDate'   
                                + @sWhere   
                                + '           
                                       ) AS DECIMAL(18, 0)) ,         
                            DF.DataID         
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,         
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,         
                                                            @EndTime) DF ,         
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,         
                                                                  @DepID,         
                                                                  @DeptLevel) DU         
                   WHERE    SD.DepDelState = 1         
                            AND SD.DepIsState = 1         
                            AND DU.DataID = SD.DepID         
                 )                 
                     
      SELECT  TOP ( @TopNum )                         
        UserID ,                         
        DepName,                             
        SaleUserName ,                             
        ' + @str + '                             
      FROM DepTable A PIVOT                                       
        ( SUM(A.Num) FOR A.DataID IN ( ' + @str + ' ) ) AS pvt                       
         ORDER BY UserID ASC;'                                   
                        END                           
                    IF ( @StatisticsPointer = 2 )--新进货客户数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.OrderSaleUser)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID) '                 
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END                 
                                      
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.OrderSaleUser=@SaleUserID '                                                   
                                END                 
                            SET @sSql = N'         
     WITH    SaleManTable         
              AS ( SELECT   SD.DepName ,         
                            SD.DepID AS UserID ,         
                    SD.DepPrincipal AS SaleUserName ,         
                            DF.DataID ,         
                            Num = CAST(( SELECT COUNT(A.CustomerID)         
                                         FROM   ( SELECT    A.OrderSaleUser ,         
                                                            A.CustomerID         
                                                  FROM      dbo.CustomerProducPrice A         
         WITH ( NOLOCK )    
                  INNER JOIN dbo.VCustomerAndLinkManV20 VCALM                 
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID                 
                           INNER JOIN dbo.VProductInfoView VPIV                 
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID         
                                                            LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
                                                            WITH ( NOLOCK ) ON A.OrderSaleUser = VSDRU.UserID         
                                                  WHERE     A.FirstStockDate >= DF.BeginDate         
                                                            AND A.FirstStockDate < DF.EndDate'   
                                + @sWhere   
                                + '         
                                                  GROUP BY  A.OrderSaleUser ,         
                                                            A.CustomerID         
                                                ) A         
                                       ) AS DECIMAL(18, 0))         
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,         
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,         
                                                            @EndTime) DF ,         
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,         
                                                                  @DepID,         
                                                                  @DeptLevel) DU         
                   WHERE    SD.DepDelState = 1         
                            AND SD.DepIsState = 1         
                            AND DU.DataID = SD.DepID         
                 )              
                     
                 SELECT  TOP ( @TopNum )                         
        UserID ,                         
        DepName,                             
        SaleUserName ,                             
        ' + @str + '                             
      FROM SaleManTable A PIVOT                                       
        ( SUM(A.Num) FOR A.DataID IN ( ' + @str + ' ) ) AS pvt                       
         ORDER BY UserID ASC;'                  
                        END             
                    IF ( @StatisticsPointer = 3 )--新进产品数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.OrderSaleUser)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID)'                 
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END                 
                                      
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '          
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.OrderSaleUser=@SaleUserID '                                                   
                                END                 
                            SET @sSql = N'WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
                            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,          
                            DF.DataID,                 
                            Num = CAST(( SELECT COUNT(A.ProductID)                 
                                         FROM   ( SELECT    A.OrderSaleUser ,                 
                                                            A.ProductID                 
                                                  FROM      dbo.CustomerProducPrice A                
                                                            WITH ( NOLOCK )                 
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM                 
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID                 
       INNER JOIN dbo.VProductInfoView VPIV                 
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID           
                                                            LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
                                                            WITH ( NOLOCK ) ON A.OrderSaleUser = VSDRU.UserID                
                                           WHERE     A.FirstStockDate >= DF.BeginDate                 
                                                            AND A.FirstStockDate < DF.EndDate '   
                                + @sWhere   
                                + '                 
                                                  GROUP BY  A.OrderSaleUser ,                 
                                                            A.ProductID                 
                                                ) A                 
                                       ) AS DECIMAL(18, 0))                 
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                                  @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
                            AND SD.DepIsState = 1           
                            AND DU.DataID = SD.DepID            
                 )                 
                     
                 SELECT  TOP ( @TopNum )                         
        UserID ,                         
        DepName,                             
        SaleUserName ,                             
        ' + @str + '                             
      FROM SaleManTable A PIVOT                                       
        ( SUM(A.Num) FOR A.DataID IN ( ' + @str + ' ) ) AS pvt                       
         ORDER BY UserID ASC;'                  
                        END             
                    IF ( @StatisticsPointer = 4 )--新进终端数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.SaleUserID)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = A.DepID)'                 
                            IF ( @HospitalID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.HospitalID=@HospitalID '                                                   
                                END                 
                                           
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                    
                                END             
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.SaleUserID=@SaleUserID '                                                   
                                END                   
                            SET @sSql = N'                 
     WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
                            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,           
                            DF.DataID,                 
                            Num = CAST(( SELECT COUNT(A.HospitalID)                 
                                         FROM   (SELECT    A.DepID ,             
                                                            A.HospitalID             
                                                  FROM      dbo.CusProHospital A             
                                                            WITH ( NOLOCK )             
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM             
    WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID             
                                                            INNER JOIN dbo.VProductInfoView VPIV             
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID 
                                                  WHERE     A.CusProHosInfoType = 5             
                                                            AND A.CusDelState = 1             
                                                            AND A.CusUserIsState = 1             
                                                            AND A.FirstDate >= DF.BeginDate             
                                                            AND A.FirstDate < DF.EndDate                 
               ' + @sWhere   
                                + '                
                                GROUP BY  A.DepID ,A.HospitalID) A                 
                   ) AS DECIMAL(18, 0))                 
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                                  @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
                            AND SD.DepIsState = 1      
                            AND DU.DataID = SD.DepID           
                 )                   
      SELECT  TOP ( @TopNum )              
        UserID ,                         
        DepName,                             
        SaleUserName ,                             
        ' + @str + '                             
      FROM SaleManTable A PIVOT                                       
        ( SUM(A.Num) FOR A.DataID IN ( ' + @str + ' ) ) AS pvt                       
         ORDER BY UserID ASC;'                  
                        END             
                    IF ( @StatisticsPointer = 5 )--新开发产品终端数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.SaleUserID)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = A.DepID)'                 
                            IF ( @HospitalID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.HospitalID=@HospitalID '                                                   
                                END                 
                                          
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END             
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.SaleUserID=@SaleUserID '                                                   
                                END                   
                            SET @sSql = N'                 
     WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
                            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,           
                            DF.DataID,                  
                            Num = CAST(( SELECT COUNT(A.HospitalID)            
                                         FROM   (SELECT    A.DepID ,             
                                                            A.ProductID ,             
                                                            A.HospitalID             
                                                  FROM      dbo.CusProHospital A             
                                                            WITH ( NOLOCK )             
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM             
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID             
                                                            INNER JOIN dbo.VProductInfoView VPIV             
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID 
                                                  WHERE     A.CusProHosInfoType = 5             
                                                            AND A.CusDelState = 1             
                                           AND A.CusUserIsState = 1             
                                                            AND A.FirstDate >= DF.BeginDate             
                                                            AND A.FirstDate < DF.EndDate                 
               ' + @sWhere   
                                + '                
                                GROUP BY  A.DepID ,A.ProductID,A.HospitalID) A                 
                                       ) AS DECIMAL(18, 0))                  
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                                  @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
                 AND SD.DepIsState = 1           
                            AND DU.DataID = SD.DepID           
                 )                   
      SELECT  TOP ( @TopNum )                         
        UserID ,                         
      DepName,                             
        SaleUserName ,                             
        ' + @str + '                             
      FROM SaleManTable A PIVOT                                       
        ( SUM(A.Num) FOR A.DataID IN ( ' + @str + ' ) ) AS pvt                       
         ORDER BY UserID ASC;'                  
                        END                     
                END                     
            IF ( @DateType = 2 )--按月                        
                BEGIN                                   
                    IF ( @StatisticsPointer = 1 )--新增客户数                                   
                        BEGIN                 
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=VCALM.InUser)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID)'           
                     
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND VCALM.InUser=@SaleUserID '                                                   
                                END                 
               
                            SET @sSql = N'         
     WITH    DepTable         
              AS ( SELECT   SD.DepID AS UserID ,         
                            SD.DepName ,         
                            SD.DepPrincipal AS SaleUserName ,         
                            Num = CAST(( SELECT COUNT(CustomerID)         
                                         FROM   dbo.VCustomerAndLinkManV20 VCALM         
                                                WITH ( NOLOCK )         
                                                LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
                                                WITH ( NOLOCK ) ON VCALM.InUser = VSDRU.UserID         
                                         WHERE  VCALM.CussState = 1         
                                                AND VCALM.CusDelState = 1         
                                                AND VCALM.InDate >= DF.BeginDate         
                                                AND VCALM.InDate < DF.EndDate'   
                                + @sWhere   
                                + '           
                                       ) AS DECIMAL(18, 0)) ,         
                            DF.DataID         
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,         
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,         
                                                            @EndTime) DF ,         
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,         
                                                                  @DepID,         
                                                                  @DeptLevel) DU         
                   WHERE    SD.DepDelState = 1         
                            AND SD.DepIsState = 1         
                            AND DU.DataID = SD.DepID         
                 )           
                                 
           SELECT  TOP ( @TopNum )           
       UserID ,           
       DepName,           
                SaleUserName ,           
                January ,            
                February ,                             
                March ,                             
                April ,                             
                May ,                             
                June ,                             
                July ,                             
                August ,                             
                September ,                             
                October ,                             
                November ,                             
                December ,                             
                TotalNum                             
        FROM    ( SELECT                              
                            UserID ,                         
          DepName,                             
                            SaleUserName ,                             
                            [1] AS January ,                             
                            [2] AS February ,                             
                            [3] AS March ,                             
                            [4] AS April ,                             
                            [5] AS May ,                             
                            [6] AS June ,                             
                            [7] AS July ,                             
                            [8] AS August ,                             
                            [9] AS September ,                             
                            [10] AS October ,                   
                            [11] AS November ,                             
                            [12] AS December ,                             
                            ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)                             
                            + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0)                             
                            + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0)                             
                            + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS TotalNum                             
                  FROM      DepTable A PIVOT                                       
       ( SUM(A.Num) FOR A.DataID IN ( [1], [2], [3], [4], [5], [6],                             
                                                   [7], [8], [9], [10], [11], [12] ) ) AS pvt                                  ) B ORDER BY   '   
                                + @sOrder + ' ;'                                 
                        END                            
                    IF ( @StatisticsPointer = 2 )--新进货客户数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.OrderSaleUser)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID)'                 
                            IF ( @ProductID > -1 )  
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END                 
                                      
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.OrderSaleUser=@SaleUserID '                                                   
                                END           
                            SET @sSql = N'         
     WITH    SaleManTable         
              AS ( SELECT   SD.DepName ,         
                            SD.DepID AS UserID ,         
                            SD.DepPrincipal AS SaleUserName ,         
                            DF.DataID ,         
                   Num = CAST(( SELECT COUNT(A.CustomerID)         
                                         FROM   ( SELECT    A.OrderSaleUser ,         
                                                            A.CustomerID         
                                                  FROM      dbo.CustomerProducPrice A         
                                                            WITH ( NOLOCK )         
                  INNER JOIN dbo.VCustomerAndLinkManV20 VCALM                 
                                          WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID                 
                                                            INNER JOIN dbo.VProductInfoView VPIV                 
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID         
                                                            LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
                                                            WITH ( NOLOCK ) ON A.OrderSaleUser = VSDRU.UserID         
                                                  WHERE     A.FirstStockDate >= DF.BeginDate         
                                                            AND A.FirstStockDate < DF.EndDate'   
                                + @sWhere   
                                + '         
                                                  GROUP BY  A.OrderSaleUser ,         
      A.CustomerID         
                                                ) A         
                                       ) AS DECIMAL(18, 0))         
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,         
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,         
                                                            @EndTime) DF ,         
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,         
                                                                  @DepID,         
                                                                  @DeptLevel) DU         
                   WHERE    SD.DepDelState = 1         
                            AND SD.DepIsState = 1         
                            AND DU.DataID = SD.DepID         
                 )                
                                  
                SELECT  TOP ( @TopNum )                         
       UserID ,                         
       DepName,                             
                SaleUserName ,                
                January ,                             
                February ,                             
                March ,                             
                April ,                   
                May ,                             
                June ,                             
               July ,                             
                August ,                             
                September ,                             
                October ,                             
                November ,                             
                December ,                             
                TotalNum                             
        FROM    ( SELECT                              
                            UserID ,                         
          DepName,                             
                            SaleUserName ,                             
                            [1] AS January ,                             
                            [2] AS February ,                             
                            [3] AS March ,                             
                            [4] AS April ,                             
                            [5] AS May ,                             
                            [6] AS June ,                             
                            [7] AS July ,                             
                            [8] AS August ,                             
                            [9] AS September ,                             
                            [10] AS October ,                             
                            [11] AS November ,                             
                            [12] AS December ,                                                    ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)                             
                            + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0)                             
                            + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0)                             
                            + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS TotalNum                             
                  FROM      SaleManTable A PIVOT                                       
       ( SUM(A.Num) FOR A.DataID IN ( [1], [2], [3], [4], [5], [6],                         
                                                   [7], [8], [9], [10], [11], [12] ) ) AS pvt                             
                ) B ORDER BY   ' + @sOrder + ' ;'                  
                        END             
                    IF ( @StatisticsPointer = 3 )--新进产品数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.OrderSaleUser)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = VSDRU.DepID)'                 
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END                 
                                       
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.OrderSaleUser=@SaleUserID '                                                   
                                END                 
                            SET @sSql = N'WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,           
                            DF.DataID,                 
                            Num = CAST(( SELECT COUNT(A.ProductID)                 
                                         FROM   ( SELECT    A.OrderSaleUser ,                 
                                                            A.ProductID                 
                                                  FROM      dbo.CustomerProducPrice A                 
                                                            WITH ( NOLOCK )                 
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM                 
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID                 
                                                            INNER JOIN dbo.VProductInfoView VPIV                 
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID           
                                                            LEFT JOIN dbo.VSysDepRegionUserV20 VSDRU         
                                                            WITH ( NOLOCK ) ON A.OrderSaleUser = VSDRU.UserID                
                                                  WHERE     A.FirstStockDate >= DF.BeginDate                 
                                                            AND A.FirstStockDate < DF.EndDate '   
                                + @sWhere   
                                + '                 
                                    GROUP BY  A.OrderSaleUser ,                 
                                                            A.ProductID                 
                                                ) A                 
                                       ) AS DECIMAL(18, 0))                 
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                      @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
                            AND SD.DepIsState = 1           
                            AND DU.DataID = SD.DepID            
                 )                 
                                  
                SELECT  TOP ( @TopNum )                         
       UserID ,                         
       DepName,                             
                SaleUserName ,                             
                January ,                             
                February ,                             
                March ,                             
                April ,                             
                May ,                             
                June ,                             
                July ,                             
                August ,                             
                September ,                             
                October ,                             
                November ,                             
                December ,                             
                TotalNum                        
        FROM    ( SELECT                              
                            UserID ,                         
          DepName,                             
                            SaleUserName ,                             
                            [1] AS January ,                             
                            [2] AS February ,                             
                            [3] AS March ,                             
                            [4] AS April ,                             
                            [5] AS May ,                             
                            [6] AS June ,                             
                            [7] AS July ,                             
                            [8] AS August ,                             
                            [9] AS September ,                             
                            [10] AS October ,                             
                            [11] AS November ,                             
                            [12] AS December ,                             
                            ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)                             
                            + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0)                             
                            + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0)                             
                            + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS TotalNum                             
                  FROM      SaleManTable A PIVOT                                       
       ( SUM(A.Num) FOR A.DataID IN ( [1], [2], [3], [4], [5], [6],                             
                                                   [7], [8], [9], [10], [11], [12] ) ) AS pvt                             
                ) B ORDER BY   ' + @sOrder + ' ;'                  
                        END             
                    IF ( @StatisticsPointer = 4 )--新进终端数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.SaleUserID) 
     AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = A.DepID) '                 
                            IF ( @HospitalID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.HospitalID=@HospitalID '                                                   
                                END                 
                                            
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END             
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.SaleUserID=@SaleUserID '                                                   
                                END                 
                            SET @sSql = N'                 
     WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
                            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,           
                            DF.DataID,                 
                            Num = CAST(( SELECT COUNT(A.HospitalID)                 
                                         FROM   (SELECT    A.DepID ,             
                             A.HospitalID             
                                                  FROM      dbo.CusProHospital A             
         WITH ( NOLOCK )             
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM             
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID             
                                                            INNER JOIN dbo.VProductInfoView VPIV             
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID           
    --                                                        LEFT JOIN dbo.SysDepartment SD1           
    --              WITH ( NOLOCK ) ON A.DepID= SD1.DepID             
                                                  WHERE     A.CusProHosInfoType = 5             
                                                            AND A.CusDelState = 1             
                                                            AND A.CusUserIsState = 1             
                                                            AND A.FirstDate >= DF.BeginDate             
                                                            AND A.FirstDate < DF.EndDate                 
               ' + @sWhere   
                                + '                
                             GROUP BY  A.DepID ,A.HospitalID) A                 
                   ) AS DECIMAL(18, 0))                 
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                                  @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
            AND SD.DepIsState = 1           
                            AND DU.DataID = SD.DepID           
                 )                  
                                 
           SELECT  TOP ( @TopNum )                         
       UserID ,                         
       DepName,                             
                SaleUserName ,                             
                January ,                             
                February ,                             
                March ,                             
                April ,                             
                May ,                             
                June ,                             
                July ,                             
                August ,                             
                September ,                             
                October ,                             
              November ,                             
             December ,                             
                TotalNum                             
        FROM    ( SELECT                              
                            UserID ,                         
          DepName,                             
                            SaleUserName ,                                        [1] AS January ,                             
                            [2] AS February ,                             
                            [3] AS March ,                             
                            [4] AS April ,                             
                            [5] AS May ,                             
                            [6] AS June ,                             
                            [7] AS July ,                             
                            [8] AS August ,                             
                            [9] AS September ,                             
                            [10] AS October ,                             
                            [11] AS November ,                             
                            [12] AS December ,                             
                            ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)                             
                            + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0)                             
             + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0)                             
                            + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS TotalNum                             
                  FROM      SaleManTable A PIVOT                                       
       ( SUM(A.Num) FOR A.DataID IN ( [1], [2], [3], [4], [5], [6],                             
                                                   [7], [8], [9], [10], [11], [12] ) ) AS pvt                             
                ) B ORDER BY   ' + @sOrder + ' ;'                 
                        END             
                    IF ( @StatisticsPointer = 5 )--新开发产品终端数                                   
                        BEGIN           
                            SET @sWhere = @sWhere   
                                + ' AND EXISTS( SELECT TOP 1 1 FROM dbo.VSysUserDataRight SUDS                                                  
          WHERE SUDS.UserID=@CurrentUserID AND SUDS.ViewedUserID=A.SaleUserID)            
       AND EXISTS( SELECT TOP 1 1 FROM [dbo].[UF_XA_UserDataSearch_DepartmentSearch_V40](SD.DepID) ds                 
             WHERE ds.DataID = A.DepID)'                 
                            IF ( @HospitalID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.HospitalID=@HospitalID '                                                   
                                END                 
                                      
                            IF ( @ProductID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.ProductID=@ProductID '                                                   
                                END             
                            IF ( @ProTypeID > -1 )    
                                BEGIN             
                                    SET @sWhere = @sWhere   
                                        + ' AND VPIV.ProType=@ProTypeID '             
                                END           
                            IF ( @SaleUserID > -1 )    
                                BEGIN                                                   
                                    SET @sWhere = @sWhere   
                                        + ' AND A.SaleUserID=@SaleUserID '                                                   
                                END                 
                            SET @sSql = N'                 
     WITH    SaleManTable                 
              AS ( SELECT   SD.DepName ,                 
                            SD.DepID AS UserID ,                 
                            SD.DepPrincipal AS SaleUserName,           
                            DF.DataID,                  
                            Num = CAST(( SELECT COUNT(A.HospitalID)                 
                                         FROM   (SELECT    A.DepID ,             
                                                            A.ProductID ,             
                                                            A.HospitalID             
                                                  FROM      dbo.CusProHospital A             
                                                            WITH ( NOLOCK )             
                                                            INNER JOIN dbo.VCustomerAndLinkManV20 VCALM             
                                                            WITH ( NOLOCK ) ON A.CustomerID = VCALM.CustomerID             
                                                            INNER JOIN dbo.VProductInfoView VPIV             
                                                            WITH ( NOLOCK ) ON A.ProductID = VPIV.ProductID           
    --                                                        LEFT JOIN dbo.SysDepartment SD1           
    --              WITH ( NOLOCK ) ON A.DepID = SD1.DepID             
                                                  WHERE     A.CusProHosInfoType = 5             
                                                            AND A.CusDelState = 1             
                                                            AND A.CusUserIsState = 1             
                                                            AND A.FirstDate >= DF.BeginDate             
                                                            AND A.FirstDate < DF.EndDate                 
               ' + @sWhere   
                                + '                
                                GROUP BY  A.DepID ,A.ProductID,A.HospitalID) A                 
                                       ) AS DECIMAL(18, 0))                  
                   FROM     dbo.SysDepartment SD WITH ( NOLOCK ) ,           
                            dbo.[UF_XA_GetDatePartTable_21](@DateType, @StartTime,           
                                                            @EndTime) DF ,           
                            dbo.UF_XA_Report_GetSortDeptListByContains(@CurrentUserID,           
                                                                  @DepID,           
                                                                  @DeptLevel) DU           
                   WHERE    SD.DepDelState = 1           
                            AND SD.DepIsState = 1           
                            AND DU.DataID = SD.DepID           
                 )                 
                                 
           SELECT  TOP ( @TopNum )                         
       UserID ,                         
       DepName,                             
                SaleUserName ,                             
                January ,                             
                February ,                             
                March ,                             
                April ,                             
                May ,                             
                June ,                             
                July ,                             
                August ,                             
      September ,                          
                October ,                             
                November ,                             
                December ,                             
                TotalNum                             
        FROM    ( SELECT                              
                            UserID ,                         
          DepName,                             
                            SaleUserName ,                                        [1] AS January ,                             
                            [2] AS February ,                             
                            [3] AS March ,                             
                            [4] AS April ,                             
                            [5] AS May ,                             
                            [6] AS June ,                             
                            [7] AS July ,                             
                            [8] AS August ,                             
                            [9] AS September ,                        
                            [10] AS October ,                             
                            [11] AS November ,                             
                            [12] AS December ,                             
                            ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)                             
                            + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0)                             
                            + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0)                             
                            + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS TotalNum                             
                  FROM      SaleManTable A PIVOT                           
       ( SUM(A.Num) FOR A.DataID IN ( [1], [2], [3], [4], [5], [6],                             
                                                   [7], [8], [9], [10], [11], [12] ) ) AS pvt                             
                ) B ORDER BY   ' + @sOrder + ' ;'                 
                        END                
                END                                           
        END                                                  
        EXEC SP_EXECUTESQL @sSql, N'@CurrentUserID INT ,           
     @DeptLevel INT,                 
     @DepID INT ,                 
     @SaleUserID INT ,                 
     @CusType SMALLINT ,                 
     @CustomerID INT ,                 
     @ProTypeID INT,                 
     @ProductID INT,                 
     @HospitalID INT,                 
     @DateType INT ,--统计区间:6-按年 2-按月                 
     @StartTime DATETIME ,                 
     @EndTime DATETIME ,                 
     @SortField VARCHAR(100) ,                 
     @SortMode VARCHAR(20) ,                 
     @TopNum INT ,   
     @StatisticsPointer SMALLINT', @CurrentUserID, @DeptLevel, @DepID, @SaleUserID,   
            @CusType, @CustomerID, @ProTypeID, @ProductID, @HospitalID, @DateType,   
            @StartTime, @EndTime, @SortField, @SortMode, @TopNum,   
            @StatisticsPointer ;

  • 相关阅读:
    Android smali 语法
    iOS 发布计费点测试
    how-to-stop-non-jailbroken-pirates-theory
    shell script
    文章收藏
    NB BAT批量读取图片文件属性
    JAVA LUHN
    MAC NDK 编译 Cocos2dx 问题
    Mac 下解压缩安装Android ndk bin 文件
    MVC Json输出调试信息
  • 原文地址:https://www.cnblogs.com/ywblog/p/2845603.html
Copyright © 2020-2023  润新知