use CubeDemo;
go
SET NOCOUNT ON
/*库存模块*/
if OBJECT_ID(N'BusinessCommon_SaleModule',N'U') is not null 
   drop table BusinessCommon_SaleModule
go
create table BusinessCommon_SaleModule
(
  BCId int identity(1,1) primary key not null,
  ShopId varchar(20) null,     ---门店Id
  ShopName nvarchar(50) null,  ---门店名称
  SaleCarCount int null,      --销售量
  BCDate datetime null      --生成日期

goinsert into BusinessCommon_SaleModule
select 'MD001','广丰店',80,'2010-4-10' union all
select 'MD001','广丰店',20,'2010-5-25' union all
select 'MD001','广丰店',55,'2011-5-1' union all
select 'MD001','广丰店',48,'2011-5-11' union all
select 'MD001','广丰店',80,'2011-3-18' union all
select 'MD001','广丰店',10,'2011-3-12' union all
select 'MD001','广丰店',40,'2011-3-25' union allselect 'MD002','现代店',50,'2011-3-27' union all
select 'MD002','现代店',40,'2011-5-15' union all
select 'MD002','现代店',80,'2010-4-18' union all
select 'MD002','现代店',40,'2010-4-13' union all
select 'MD004','海马店',70,'2011-3-15' union allselect 'MD005','一丰店',80,'2010-4-10' union all
select 'MD005','一丰店',80,'2011-3-10' union all
select 'MD005','一丰店',80,'2011-5-22' union all
select 'MD003','宝马店',20,'2011-4-10' union all
select 'MD003','宝马店',80,'2010-8-10'
goselect * from BusinessCommon_SaleModule;/* 如何根据条件 日 2011-4-18 动态查询到2010年4月(从2010年4月1日到2010年4月18日的数据)  2011年1月(从2011年1月1日到2011年1月18日的数据)  2011年2月(从2011年2月1日到2011年2月18日的数据) 2011年3月(从2011年3月1日到2011年3月18日的数据)
2011年4月(从2011年4月1日到2011年4月18日的数据)  2011年累计(从2011年1月1日到2011年4月18日的数据)
2010年累计(从2010年1月1日到2010年4月18日的数据)这些数据
 *//*   要得到的结果如下: 门店名称  2010年4月  2011年1月 2011年2月 2011年3月 2011年4月 2011年累计 2010年累计
广丰店     80          0         0        90         0         130        80
现代店     120         0         0        0          0         50         120     
宝马店     0           0         0        0          20        20          0   
海马店     0           0         0        70          0        70          0
一丰店     80          0         0        80          0        80          80    
*/   

解决方案 »

  1.   

    *
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------/*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    姓名 语文 数学 物理 平均分 总分 
    ---- ---- ---- ---- ------ ----
    李四 74   84   94   84.00  252
    张三 74   83   93   83.33  250
    */--SQL SERVER 2000 静态SQL。
    select 姓名 姓名,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理,
      cast(avg(分数*1.0) as decimal(18,2)) 平均分,
      sum(分数) 总分
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL。
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m , 
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名')drop table tb    ------------------
    ------------------
      

  2.   

    按照上面的代码   动态语句部分其中的CASE..WHEN是判断你改成
       CASE WHEN BCDate BETWEEN 2010-04-01日 AND 2010-04-18这样的一共有几行就写几行
    睡觉了 如果明天还没解决  我就帮你写完全
      

  3.   

    select ShopName,
    sum(case when BCDate between '2010-04-01' and '2010-04-18' then SaleCarCount else 0 end) as [2010年4月],
    sum(case when BCDate between '2011-01-01' and '2011-01-18' then SaleCarCount else 0 end) as [2011年1月],
    sum(case when BCDate between '2011-02-01' and '2011-02-18' then SaleCarCount else 0 end) as [2011年2月],
    sum(case when BCDate between '2011-03-01' and '2011-03-18' then SaleCarCount else 0 end) as [2011年3月],
    sum(case when BCDate between '2011-04-01' and '2011-04-18' then SaleCarCount else 0 end) as [2011年4月],
    sum(case when BCDate between '2011-01-01' and '2011-04-18' then SaleCarCount else 0 end) as [2011年累计],
    sum(case when BCDate between '2010-01-01' and '2010-04-18' then SaleCarCount else 0 end) as [2010年累计]
    from BusinessCommon_SaleModule
    group by 
    ShopName
      

  4.   


    Create View vw_BusinessCommon_SaleModule
    AS
    select ShopName, Year(BCDate) iYear, Month(BCDate) iMonth, cast(Year(BCDate) as varchar)+'年'+cast(Month(BCDate) as varchar)+'月' dDate, Sum(SaleCarCount) iCount
    from  BusinessCommon_SaleModule 
    group by ShopName, BCDate
    declare @Sql varchar(8000)
    set @Sql='Select ShopName '
    select @Sql = @Sql + ', Sum(Case when dDate='''+dDate+''' then iCount else 0 end) AS '''+dDate+'''' from vw_BusinessCommon_SaleModule
    select @Sql = @Sql + ', Sum(Case when iYear='+cast(iYear as varchar)+' then iCount else 0 end) AS '''+cast(iYear as varchar)+'年累计''' from vw_BusinessCommon_SaleModule  group by iYear
    select @Sql = @Sql + ' From vw_BusinessCommon_SaleModule Group by ShopName'
    Exec (@Sql)
      

  5.   

    if OBJECT_ID(N'BusinessCommon_SaleModule',N'U') is not null 
       drop table BusinessCommon_SaleModule
    go
    create table BusinessCommon_SaleModule
    (
      BCId int identity(1,1) primary key not null,
      ShopId varchar(20) null,     ---门店Id
      ShopName nvarchar(50) null,  ---门店名称
      SaleCarCount int null,      --销售量
      BCDate datetime null      --生成日期

    goinsert into BusinessCommon_SaleModule
    select 'MD001','广丰店',80,'2010-4-10' union all
    select 'MD001','广丰店',20,'2010-5-25' union all
    select 'MD001','广丰店',55,'2011-5-1' union all
    select 'MD001','广丰店',48,'2011-5-11' union all
    select 'MD001','广丰店',80,'2011-3-18' union all
    select 'MD001','广丰店',10,'2011-3-12' union all
    select 'MD001','广丰店',40,'2011-3-25' union allselect 'MD002','现代店',50,'2011-3-27' union all
    select 'MD002','现代店',40,'2011-5-15' union all
    select 'MD002','现代店',80,'2010-4-18' union all
    select 'MD002','现代店',40,'2010-4-13' union all
    select 'MD004','海马店',70,'2011-3-15' union allselect 'MD005','一丰店',80,'2010-4-10' union all
    select 'MD005','一丰店',80,'2011-3-10' union all
    select 'MD005','一丰店',80,'2011-5-22' union all
    select 'MD003','宝马店',20,'2011-4-10' union all
    select 'MD003','宝马店',80,'2010-8-10'
    go--select * from BusinessCommon_SaleModule;DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
    SELECT @s=ISNULL(@s+',','')+QUOTENAME(CONVERT(VARCHAR(7),BCDate,23)),
    @s1=ISNULL(@s1+',','')+'ISNULL(['+CONVERT(VARCHAR(7),BCDate,23)+'],0)'+QUOTENAME(CONVERT(VARCHAR(7),BCDate,23))
    FROM BusinessCommon_SaleModule
    GROUP BY CONVERT(VARCHAR(7),BCDate,23)
    EXEC('
    SELECT ShopName,'+@s1+',[2011年累计],[2010年累计]
    FROM (
    SELECT ShopName,SaleCarCount,CONVERT(VARCHAR(7),BCDate,23) BCMon,
    SUM(CASE YEAR(BCDate) WHEN 2011 THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) [2011年累计],
    SUM(CASE YEAR(BCDate) WHEN 2010 THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) [2010年累计]
    FROM BusinessCommon_SaleModule
    ) t 
    PIVOT(SUM(SaleCarCount) FOR BCMon IN('+@s+')) pvt
    ')
    /*
    ShopName                                           2010-04     2010-05     2010-08     2011-03     2011-04     2011-05     2011年累计     2010年累计
    -------------------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    宝马店                                                0           0           80          0           20          0           20          80
    广丰店                                                80          20          0           130         0           103         233         100
    海马店                                                0           0           0           70          0           0           70          0
    现代店                                                120         0           0           50          0           40          90          120
    一丰店                                                80          0           0           80          0           80          160         80(5 行受影响)
    */
      

  6.   

    if OBJECT_ID(N'BusinessCommon_SaleModule',N'U') is not null 
       drop table BusinessCommon_SaleModule
    go
    create table BusinessCommon_SaleModule
    (
      BCId int identity(1,1) primary key not null,
      ShopId varchar(20) null,     ---门店Id
      ShopName nvarchar(50) null,  ---门店名称
      SaleCarCount int null,      --销售量
      BCDate datetime null      --生成日期

    goinsert into BusinessCommon_SaleModule
    select 'MD001','广丰店',80,'2010-4-10' union all
    select 'MD001','广丰店',20,'2010-5-25' union all
    select 'MD001','广丰店',55,'2011-5-1' union all
    select 'MD001','广丰店',48,'2011-5-11' union all
    select 'MD001','广丰店',80,'2011-3-18' union all
    select 'MD001','广丰店',10,'2011-3-12' union all
    select 'MD001','广丰店',40,'2011-3-25' union allselect 'MD002','现代店',50,'2011-3-27' union all
    select 'MD002','现代店',40,'2011-5-15' union all
    select 'MD002','现代店',80,'2010-4-18' union all
    select 'MD002','现代店',40,'2010-4-13' union all
    select 'MD004','海马店',70,'2011-3-15' union allselect 'MD005','一丰店',80,'2010-4-10' union all
    select 'MD005','一丰店',80,'2011-3-10' union all
    select 'MD005','一丰店',80,'2011-5-22' union all
    select 'MD003','宝马店',20,'2011-4-10' union all
    select 'MD003','宝马店',80,'2010-8-10'
    go--select * from BusinessCommon_SaleModule;DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
    SELECT @s=ISNULL(@s+',','')+QUOTENAME(CONVERT(VARCHAR(7),BCDate,23)),
    @s1=ISNULL(@s1+',','')+'ISNULL(['+CONVERT(VARCHAR(7),BCDate,23)+'],0)'+QUOTENAME(CONVERT(VARCHAR(7),BCDate,23))
    FROM BusinessCommon_SaleModule
    WHERE DAY(BCDate)<=18
    GROUP BY CONVERT(VARCHAR(7),BCDate,23)
    EXEC('
    SELECT ShopName,'+@s1+',[2011年累计],[2010年累计]
    FROM (
    SELECT ShopName,SaleCarCount,CONVERT(VARCHAR(7),BCDate,23) BCMon,
    SUM(CASE YEAR(BCDate) WHEN 2011 THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) [2011年累计],
    SUM(CASE YEAR(BCDate) WHEN 2010 THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) [2010年累计]
    FROM BusinessCommon_SaleModule
    WHERE DAY(BCDate)<=18
    ) t 
    PIVOT(SUM(SaleCarCount) FOR BCMon IN('+@s+')) pvt
    ')
    /*
    ShopName                                           2010-04     2010-08     2011-03     2011-04     2011-05     2011年累计     2010年累计
    -------------------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    宝马店                                                0           80          0           20          0           20          80
    广丰店                                                80          0           90          0           103         193         80
    海马店                                                0           0           70          0           0           70          0
    现代店                                                120         0           0           0           40          40          120
    一丰店                                                80          0           80          0           0           80          80(5 行受影响)
    */加上条件
      

  7.   

    本帖最后由 htl258 于 2011-05-17 11:19:17 编辑
      

  8.   

    if OBJECT_ID(N'BusinessCommon_SaleModule',N'U') is not null 
       drop table BusinessCommon_SaleModule
    go
    create table BusinessCommon_SaleModule
    (
      BCId int identity(1,1) primary key not null,
      ShopId varchar(20) null,     ---门店Id
      ShopName nvarchar(50) null,  ---门店名称
      SaleCarCount int null,      --销售量
      BCDate datetime null      --生成日期

    goinsert into BusinessCommon_SaleModule
    select 'MD001','广丰店',80,'2010-4-10' union all
    select 'MD001','广丰店',20,'2010-5-25' union all
    select 'MD001','广丰店',55,'2011-5-1' union all
    select 'MD001','广丰店',48,'2011-5-11' union all
    select 'MD001','广丰店',80,'2011-3-18' union all
    select 'MD001','广丰店',10,'2011-3-12' union all
    select 'MD001','广丰店',40,'2011-3-25' union allselect 'MD002','现代店',50,'2011-3-27' union all
    select 'MD002','现代店',40,'2011-5-15' union all
    select 'MD002','现代店',80,'2010-4-18' union all
    select 'MD002','现代店',40,'2010-4-13' union all
    select 'MD004','海马店',70,'2011-3-15' union allselect 'MD005','一丰店',80,'2010-4-10' union all
    select 'MD005','一丰店',80,'2011-3-10' union all
    select 'MD005','一丰店',80,'2011-5-22' union all
    select 'MD003','宝马店',20,'2011-4-10' union all
    select 'MD003','宝马店',80,'2010-8-10'
    go--select * from BusinessCommon_SaleModule;
    IF OBJECT_ID('p_test')>0
        DROP PROC p_test
    GO
    CREATE PROC p_test 
    @d DATETIME
    AS
    SET NOCOUNT ON 
    DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX),@year1 VARCHAR(4),@year2 VARCHAR(4),@day VARCHAR(2),@month VARCHAR(2)
    SELECT @year1=LTRIM(YEAR(@d)),@year2=LTRIM(YEAR(@d)-1),@day=LTRIM(DAY(@d)),@month=LTRIM(MONTH(@d))
    SELECT @s=ISNULL(@s+',','')+QUOTENAME(CONVERT(VARCHAR(7),DATEADD(mm,-number,@d),23)),
            @s1=ISNULL(@s1+',','')+'ISNULL(['+CONVERT(VARCHAR(7),DATEADD(mm,-number,@d),23)+'],0)'+REPLACE(QUOTENAME(CONVERT(VARCHAR(7),DATEADD(mm,-number,@d),23)+'月'),'-','年')
    FROM MASTER..spt_values
    WHERE TYPE='p'
        AND number<MONTH(@d)
    ORDER BY number descSELECT @s=QUOTENAME(CONVERT(varchar(7),DATEADD(yy,-1,@d),23))+','+@s,
           @s1='ISNULL(['+CONVERT(VARCHAR(7),DATEADD(yy,-1,@d),23)+'],0)'+REPLACE(QUOTENAME(CONVERT(VARCHAR(7),DATEADD(yy,-1,@d),23)+'月'),'-','年')+','+@s1
    EXEC('
        SELECT ShopName,'+@s1+',['+@year1+'年累计],['+@year2+'年累计]
        FROM (
            SELECT ShopName,CASE WHEN DAY(BCDate)<='+@day+' THEN SaleCarCount ELSE 0 END SaleCarCount,CONVERT(VARCHAR(7),BCDate,23) BCMon,
                SUM(CASE  WHEN YEAR(BCDate)='+@year1+' AND BCDate<='''+@year1+'-'+@month+'-'+@day+''' THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) ['+@year1+'年累计],
                SUM(CASE YEAR(BCDate) WHEN '+@year2+' THEN SaleCarCount ELSE 0 END)OVER(PARTITION BY ShopId) ['+@year2+'年累计]
            FROM BusinessCommon_SaleModule
            WHERE ( YEAR(BCDate)='+@year1+' AND BCDate<='''+@year1+'-'+@month+'-'+@day+''')
                OR (YEAR(BCDate)='+@year2+' AND MONTH(BCDate)='+@month+' AND DAY(BCDate)<='+@day+')
        ) t 
            PIVOT(SUM(SaleCarCount) FOR BCMon IN('+@s+')) pvt
    ')
    GO
    EXEC p_test '2011-4-18'
    /*
    ShopName      2010年04月  2011年01月   2011年02月 2011年03月  2011年04月  2011年累计   2010年累计
    ------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    宝马店        0           0           0           0           20          20          0
    广丰店        80          0           0           90          0           130         80
    海马店        0           0           0           70          0           70          0
    现代店        120         0           0           0           0           50          120
    一丰店        80          0           0           80          0           80          80
    */
      

  9.   


    DECLARE @SEARCHTIME nvarchar(1000);--条件的时间
    DECLARE @LastYear nvarchar(100);--去年当月当天的时间
    DECLARE @FirstMonthToNowSQL nvarchar(4000);--总的SQL语句
    set @FirstMonthToNowSQL=''
    SET @SEARCHTIME='2011-4-18'
    set @LastYear=cast(dateadd(year,-1,@SEARCHTIME) as nvarchar(100))declare @LastYearFileName nvarchar(50)
    set @LastYearFileName=''--去年销售量的字段名
    set @LastYearFileName=cast(year(@LastYear) as nvarchar(10))+'年'+cast(month(@LastYear) as nvarchar(10))+'月'--该CTE用做获取所以的门店
    set @FirstMonthToNowSQL=@FirstMonthToNowSQL+
    '
    with AllShopId as
    (
      select distinct ShopId,ShopName  from dbo.BusinessCommon_SaleModule
    )
    '
    --去年当月累计到当天的销售俩
    set @FirstMonthToNowSQL=@FirstMonthToNowSQL+
    '
    ,LastYear_Month as
    (
      select ShopId,ShopName,SUM(SaleCarCount) as ['
      +@LastYearFileName+
      '] from dbo.BusinessCommon_SaleModule
      WHERE YEAR(BCDate)=YEAR('''+@SEARCHTIME+''')-1 AND MONTH(BCDate)=MONTH('''+@SEARCHTIME+''') AND DAY(BCDate)<=DAY('''+@SEARCHTIME+''')
      group by ShopId,ShopName
    )
    '
    declare @count int
    set @count=0--循环中每个字段的名称,如:,isnull([2011年1月],0) as [2011年1月],isnull([2011年2月],0) as [2011年2月],isnull([2011年3月],0) as [2011年3月],isnull([2011年4月],0) as [2011年4月]
    declare @cteFileName nvarchar(1000)
    set @cteFileName=''
    --循环中每个cte的链接,如: left join cte1   on cte1.ShopId=AllShopId.ShopId  left join cte2   on cte2.ShopId=AllShopId.ShopId  left join cte3   on cte3.ShopId=AllShopId.ShopId  left join cte4   on cte4.ShopId=AllShopId.ShopId 
    declare @cteInnerJoin nvarchar(1000)
    set @cteInnerJoin=''
    while @count<cast(datepart(month,@SEARCHTIME) as int)
    begin
    select @count=@count+1
    select @cteFileName=@cteFileName+',isnull(['+cast(year(@SEARCHTIME) as nvarchar(50))+'年'+cast(@count as nvarchar(50))+'月],0) as ['+cast(year(@SEARCHTIME) as nvarchar(50))+'年'+cast(@count as nvarchar(50))+'月]'select @cteInnerJoin=@cteInnerJoin+' left join cte'+cast(@count as nvarchar(10))+
    '
      on cte'+cast(@count as nvarchar(10))+'.ShopId=AllShopId.ShopId
    '
    --循环获取前几个月的销售量
    select @FirstMonthToNowSQL=@FirstMonthToNowSQL+',cte'+cast(@count as nvarchar(10))+'
     as
    (
      select ShopId,ShopName,SUM(SaleCarCount) as ['
      +cast(year(@SEARCHTIME) as nvarchar(50))+'年'+cast(@count as nvarchar(50))+'月'+
      '] from dbo.BusinessCommon_SaleModule
      WHERE YEAR(BCDate)=YEAR('''+@SEARCHTIME+''') AND MONTH(BCDate)='+cast(@count as nvarchar(20))+' AND DAY(BCDate)<=DAY('''+@SEARCHTIME+''')
      group by ShopId,ShopName
    )
    'if @count=cast(datepart(month,@SEARCHTIME) as int) 
      break
    else 
      continue
    end--本年年累计
    select @FirstMonthToNowSQL=@FirstMonthToNowSQL+'
    ,ThisYearAll as 
    (
      select ShopId,ShopName,SUM(SaleCarCount) as ['+cast(year(@SEARCHTIME) as nvarchar(100))+'年累计] from dbo.BusinessCommon_SaleModule
      WHERE YEAR(BCDate)=YEAR('''+@SEARCHTIME+''') AND BCDate<='''+@SEARCHTIME+'''
      group by ShopId,ShopName
    )
    '
    --去年同期年累计
    select @FirstMonthToNowSQL=@FirstMonthToNowSQL+'
    ,LastYearAll as 
    (
      select ShopId,ShopName,SUM(SaleCarCount) as ['+cast(year(@SEARCHTIME)-1 as nvarchar(100))+'年累计] from dbo.BusinessCommon_SaleModule
      WHERE YEAR(BCDate)=YEAR('''+@SEARCHTIME+''')-1 AND BCDate<=dateadd(year,-1,'''+@SEARCHTIME+''')
      group by ShopId,ShopName
    )'--最后的的SQL查询语句
    select @FirstMonthToNowSQL=@FirstMonthToNowSQL+
    '
     select AllShopId.ShopName as [门店名称], isnull(['+@LastYearFileName+'],0) as ['+@LastYearFileName+']'+@cteFileName+' 
     ,isnull(['+cast(year(@SEARCHTIME) as nvarchar(100))+'年累计],0) as ['+cast(year(@SEARCHTIME) as nvarchar(100))+'年累计]
     ,isnull(['+cast(year(@SEARCHTIME)-1 as nvarchar(100))+'年累计],0) as ['+cast(year(@SEARCHTIME)-1 as nvarchar(100))+'年累计]
     from AllShopId 
     left join LastYear_Month on AllShopId.ShopId=LastYear_Month.ShopId 
    '+@cteInnerJoin+
    '
     left join ThisYearAll on ThisYearAll.ShopId=AllShopId.ShopId
     left join LastYearAll on LastYearAll.ShopId=AllShopId.ShopId
    'exec sp_executesql @FirstMonthToNowSQL