Sql Server行转列 动态拼接sql

要求导出的excel 每一列显示的各个分公司的名称,每一行显示的各个分公司的产品数量,且每一次都要导出5版数据。

显示样例:

 数据表结构

 所以这里需要动态的行转列,动态是因为列分公司是动态的,会进行新增和删除。所以这里会拼接sql

case when ... else ... end动态拼接

比如:

WHILE EXISTS(SELECT code FROM @Cus)
BEGIN
-- 也可以使用top 1
SET ROWCOUNT 1
SELECT @tempcode= code, @tempname= name FROM @Cus;
set @sqlstr1= @sqlstr1 + 'sum(['+@tempname+']) as ['+@tempname+'],';
set @sqlstr2=@sqlstr2 + 'case CustomerCode when '''+@tempcode +''' then sum(qty) else 0 end as '''+@tempname+''',';
SET ROWCOUNT 0
DELETE FROM @Cus WHERE code=@tempcode;
END

 全部执行的存储过程:

  

  1 DECLARE @Cus TABLE 
  2         (
  3           code [NVARCHAR](50),
  4           name [NVARCHAR](200) 
  5         ); 
  6 
  7 insert into @Cus select code,name from Bus_Base_CustomerCode
  8 DECLARE @selectMonth INT
  9 declare @tempcode varchar(max)
 10 declare @tempname varchar(max)
 11 declare @sqlstr1 varchar(max)
 12 declare @sqlstr2 varchar(max)
 13 declare @sqlstrall varchar(max)
 14 DECLARE @sqlstrall2 VARCHAR(max)
 15 DECLARE @sqlstrall3 VARCHAR(max)
 16 DECLARE @sqlstrall4 VARCHAR(max)
 17 DECLARE @sqlstrall5 VARCHAR(max)
 18 set @sqlstr1=''
 19 set @sqlstr2=''
 20 WHILE EXISTS(SELECT code FROM @Cus)
 21 BEGIN
 22     -- 也可以使用top 1
 23     SET ROWCOUNT 1
 24     SELECT @tempcode= code, @tempname= name  FROM @Cus;  
 25     set @sqlstr1= @sqlstr1 + 'sum(['+@tempname+']) as ['+@tempname+'],';
 26     set @sqlstr2=@sqlstr2 + 'case CustomerCode when '''+@tempcode +''' then sum(qty) else 0 end as '''+@tempname+''',';
 27     SET ROWCOUNT 0
 28     DELETE FROM @Cus WHERE code=@tempcode;
 29 END
 30 --第一版数据
 31 if(@month='1')
 32 begin
 33     set @sqlstrall='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 34     where ImportMonth='+CONVERT(VARCHAR(50),11)+' and PlanMonth='+@month+' and year='+Convert(varchar,Convert(int,@year)-1)+'
 35     group by CustomerCode,ProductCode) s
 36     group by ProductCode ';
 37 end
 38 else if(@month='2')
 39 begin
 40     set @sqlstrall='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 41         where ImportMonth='+CONVERT(VARCHAR(50),12)+' and PlanMonth='+@month+' and year='+Convert(varchar,Convert(int,@year)-1)+'
 42         group by CustomerCode,ProductCode) s
 43         group by ProductCode ';
 44 end
 45 else
 46 begin
 47     set @sqlstrall='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 48     where ImportMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,@month)-2))+' and PlanMonth='+@month+' and year='+@year+'
 49     group by CustomerCode,ProductCode) s
 50     group by ProductCode ';
 51 end
 52 
 53 --第二版数据
 54 if(@month='2')
 55 begin
 56     set @sqlstrall2='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 57     where ImportMonth='+CONVERT(VARCHAR(50),11)+' and PlanMonth='+@month+' and year='+Convert(varchar,Convert(int,@year)-1)+'
 58     group by CustomerCode,ProductCode) s
 59     group by ProductCode ';
 60 end
 61 else
 62 begin
 63     set @sqlstrall2='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 64     where ImportMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,@month)-1))+' and PlanMonth='+@month+' and year='+@year+'
 65     group by CustomerCode,ProductCode) s
 66     group by ProductCode ';
 67 end
 68 
 69 --第三版数据
 70 
 71 set @sqlstrall3='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 72 where ImportMonth='+@month+' and PlanMonth='+@month+' and year='+@year+'
 73 group by CustomerCode,ProductCode) s
 74 group by ProductCode ';
 75 --第四版数据
 76 if(@month='12')
 77 begin
 78     set @sqlstrall4='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 79     where ImportMonth='+@month+' and PlanMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,1)))+' and year='+Convert(varchar,Convert(int,@year)+1)+'
 80     group by CustomerCode,ProductCode) s
 81     group by ProductCode ';
 82 end
 83 else
 84 begin
 85     set @sqlstrall4='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 86     where ImportMonth='+@month+' and PlanMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,@month)+1))+' and year='+Convert(varchar,Convert(int,@year))+'
 87     group by CustomerCode,ProductCode) s
 88     group by ProductCode ';
 89 end
 90 
 91 --第五版数据
 92 if(@month='12')
 93 begin
 94     set @sqlstrall5='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
 95     where ImportMonth='+@month+' and PlanMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,2)))+' and year='+Convert(varchar,Convert(int,@year)+1)+'
 96     group by CustomerCode,ProductCode) s
 97     group by ProductCode ';
 98 end
 99 else if(@month='11')
100 begin
101 set @sqlstrall5='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
102     where ImportMonth='+@month+' and PlanMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,1)))+' and year='+Convert(varchar,Convert(int,@year)+1)+'
103     group by CustomerCode,ProductCode) s
104     group by ProductCode ';
105 end
106 else
107 begin
108     set @sqlstrall5='select ProductCode 产品代码, '+SUBSTRING(@sqlstr1,1,LEN(@sqlstr1)-1) +' from (select '+ @sqlstr2+'ProductCode  from [Bus_Struct_RollingPlan]
109     where ImportMonth='+@month+' and PlanMonth='+CONVERT(VARCHAR(50),(CONVERT(INT,@month)+2))+' and year='+@year+'
110     group by CustomerCode,ProductCode) s
111     group by ProductCode ';
112 end
113 
114 exec (@sqlstrall);
115 exec (@sqlstrall2);
116 exec (@sqlstrall3);
117 exec (@sqlstrall4);
118 exec (@sqlstrall5);
View Code

这里有一个小问题:where 后面的年份如果是int的会报错,所以要转换未varchar类型,因为表字段类型是varchar.记得所有我们是int类型的化,sql会默认转换的,不知道为什么会报错,最后还是统一转换类型好了。

最后的生成的某一条sql是这样子的

print @sqlstrall
print @sqlstrall2
print @sqlstrall3
print @sqlstrall4

select ProductCode 产品代码, 
sum([太太乐郑州分公司]) as [太太乐郑州分公司],
sum([太太乐福州分公司]) as [太太乐福州分公司],
sum([太太乐武汉分公司]) as [太太乐武汉分公司],
sum([太太乐南昌分公司]) as [太太乐南昌分公司],
sum([太太乐青岛分公司]) as [太太乐青岛分公司],
sum([太太乐芜湖分公司]) as [太太乐芜湖分公司],
sum([太太乐烟台分公司]) as [太太乐烟台分公司],
sum([太太乐济南分公司]) as [太太乐济南分公司],
sum([上海东铪商贸有限公司(绍兴)]) as [上海东铪商贸有限公司(绍兴)],
sum([上海东铪商贸有限公司(无锡)]) as [上海东铪商贸有限公司(无锡)],
sum([上海东铪商贸有限公司(总部零售)]) as [上海东铪商贸有限公司(总部零售)],
sum([太太乐嘉兴分公司]) as [太太乐嘉兴分公司],
sum([太太乐长沙分公司]) as [太太乐长沙分公司],
sum([太太乐盐城分公司]) as [太太乐盐城分公司],
sum([太太乐南京分公司]) as [太太乐南京分公司],
sum([太太乐宁波分公司]) as [太太乐宁波分公司],
sum([太太乐南通分公司]) as [太太乐南通分公司],
sum([太太乐台州分公司]) as [太太乐台州分公司],
sum([太太乐徐州分公司]) as [太太乐徐州分公司],
sum([太太乐苏州分公司]) as [太太乐苏州分公司],
sum([太太乐厦门分公司]) as [太太乐厦门分公司],
sum([太太乐泉州分公司]) as [太太乐泉州分公司],
sum([太太乐温州分公司]) as [太太乐温州分公司],
sum([太太乐金华分公司]) as [太太乐金华分公司],
sum([太太乐杭州分公司]) as [太太乐杭州分公司],
sum([上海东铪商贸有限公司(苍南)]) as [上海东铪商贸有限公司(苍南)],
sum([太太乐扬州分公司]) as [太太乐扬州分公司],
sum([太太乐无锡(销售)分公司]) as [太太乐无锡(销售)分公司],
sum([上海东铪商贸有限公司]) as [上海东铪商贸有限公司],
sum([太太乐南宁分公司]) as [太太乐南宁分公司],
sum([太太乐广州分公司]) as [太太乐广州分公司],
sum([太太乐成都分公司]) as [太太乐成都分公司],
sum([太太乐兰州分公司]) as [太太乐兰州分公司],
sum([太太乐西安分公司]) as [太太乐西安分公司],
sum([太太乐贵阳分公司]) as [太太乐贵阳分公司],
sum([太太乐太原分公司]) as [太太乐太原分公司],
sum([太太乐北京分公司]) as [太太乐北京分公司],
sum([太太乐哈尔滨分公司]) as [太太乐哈尔滨分公司],
sum([太太乐石家庄分公司]) as [太太乐石家庄分公司],
sum([太太乐大连分公司]) as [太太乐大连分公司],
sum([太太乐长春分公司]) as [太太乐长春分公司],
sum([太太乐沈阳分公司]) as [太太乐沈阳分公司],
sum([太太乐天津分公司]) as [太太乐天津分公司],
sum([太太乐昆明分公司]) as [太太乐昆明分公司],
sum([太太乐合肥分公司]) as [太太乐合肥分公司],
sum([太太乐西安外埠分公司]) as [太太乐西安外埠分公司],
sum([太太乐洛阳分公司]) as [太太乐洛阳分公司],
sum([太太乐锦州分公司]) as [太太乐锦州分公司],
sum([太太乐齐齐哈尔分公司]) as [太太乐齐齐哈尔分公司],
sum([太太乐自贡分公司]) as [太太乐自贡分公司],
sum([太太乐阜阳分公司]) as [太太乐阜阳分公司],
sum([太太乐乌鲁木齐分公司]) as [太太乐乌鲁木齐分公司],
sum([太太乐呼和浩特分公司]) as [太太乐呼和浩特分公司],
sum([太太乐重庆分公司]) as [太太乐重庆分公司],
sum([太太乐深圳分公司]) as [太太乐深圳分公司],
sum([太太乐宜昌分公司]) as [太太乐宜昌分公司],
sum([太太乐银川分公司]) as [太太乐银川分公司] from (
select 
        case CustomerCode when '7G00313' then sum(qty) else 0 end as '太太乐郑州分公司',
        case CustomerCode when '7G00325' then sum(qty) else 0 end as '太太乐福州分公司',
        case CustomerCode when '7G00312' then sum(qty) else 0 end as '太太乐武汉分公司',
        case CustomerCode when '7G00331' then sum(qty) else 0 end as '太太乐南昌分公司',
        case CustomerCode when '7G00311' then sum(qty) else 0 end as '太太乐青岛分公司',
        case CustomerCode when '7G00341' then sum(qty) else 0 end as '太太乐芜湖分公司',
        case CustomerCode when '7G00342' then sum(qty) else 0 end as '太太乐烟台分公司',
        case CustomerCode when '7G00310' then sum(qty) else 0 end as '太太乐济南分公司',
        case CustomerCode when '7G00401' then sum(qty) else 0 end as '上海东铪商贸有限公司(绍兴)',
        case CustomerCode when '7G00431' then sum(qty) else 0 end as '上海东铪商贸有限公司(无锡)',
        case CustomerCode when '7G00416' then sum(qty) else 0 end as '上海东铪商贸有限公司(总部零售)',
        case CustomerCode when '7G00332' then sum(qty) else 0 end as '太太乐嘉兴分公司',
        case CustomerCode when '7G00330' then sum(qty) else 0 end as '太太乐长沙分公司',
        case CustomerCode when '7G00307' then sum(qty) else 0 end as '太太乐盐城分公司',
        case CustomerCode when '7G00306' then sum(qty) else 0 end as '太太乐南京分公司',
        case CustomerCode when '7G00333' then sum(qty) else 0 end as '太太乐宁波分公司',
        case CustomerCode when '7G00354' then sum(qty) else 0 end as '太太乐南通分公司',
        case CustomerCode when '7G00340' then sum(qty) else 0 end as '太太乐台州分公司',
        case CustomerCode when '7G00336' then sum(qty) else 0 end as '太太乐徐州分公司',
        case CustomerCode when '7G00305' then sum(qty) else 0 end as '太太乐苏州分公司',
        case CustomerCode when '7G00346' then sum(qty) else 0 end as '太太乐厦门分公司',
        case CustomerCode when '7G00360' then sum(qty) else 0 end as '太太乐泉州分公司',
        case CustomerCode when '7G00302' then sum(qty) else 0 end as '太太乐温州分公司',
        case CustomerCode when '7G00301' then sum(qty) else 0 end as '太太乐金华分公司',
        case CustomerCode when '7G00300' then sum(qty) else 0 end as '太太乐杭州分公司',
        case CustomerCode when '7G00245' then sum(qty) else 0 end as '上海东铪商贸有限公司(苍南)',
        case CustomerCode when '7G00304' then sum(qty) else 0 end as '太太乐扬州分公司',
        case CustomerCode when '7G00303' then sum(qty) else 0 end as '太太乐无锡(销售)分公司',
        case CustomerCode when '7G00241' then sum(qty) else 0 end as '上海东铪商贸有限公司',
        case CustomerCode when '7G00326' then sum(qty) else 0 end as '太太乐南宁分公司',
        case CustomerCode when '7G00324' then sum(qty) else 0 end as '太太乐广州分公司',
        case CustomerCode when '7G00327' then sum(qty) else 0 end as '太太乐成都分公司',
        case CustomerCode when '7G00323' then sum(qty) else 0 end as '太太乐兰州分公司',
        case CustomerCode when '7G00322' then sum(qty) else 0 end as '太太乐西安分公司',
        case CustomerCode when '7G00328' then sum(qty) else 0 end as '太太乐贵阳分公司',
        case CustomerCode when '7G00314' then sum(qty) else 0 end as '太太乐太原分公司',
        case CustomerCode when '7G00315' then sum(qty) else 0 end as '太太乐北京分公司',
        case CustomerCode when '7G00318' then sum(qty) else 0 end as '太太乐哈尔滨分公司',
        case CustomerCode when '7G00317' then sum(qty) else 0 end as '太太乐石家庄分公司',
        case CustomerCode when '7G00321' then sum(qty) else 0 end as '太太乐大连分公司',
        case CustomerCode when '7G00320' then sum(qty) else 0 end as '太太乐长春分公司',
        case CustomerCode when '7G00319' then sum(qty) else 0 end as '太太乐沈阳分公司',
        case CustomerCode when '7G00316' then sum(qty) else 0 end as '太太乐天津分公司',
        case CustomerCode when '7G00329' then sum(qty) else 0 end as '太太乐昆明分公司',
        case CustomerCode when '7G00308' then sum(qty) else 0 end as '太太乐合肥分公司',
        case CustomerCode when '7G00361' then sum(qty) else 0 end as '太太乐西安外埠分公司',
        case CustomerCode when '7G00358' then sum(qty) else 0 end as '太太乐洛阳分公司',
        case CustomerCode when '7G00352' then sum(qty) else 0 end as '太太乐锦州分公司',
        case CustomerCode when '7G00351' then sum(qty) else 0 end as '太太乐齐齐哈尔分公司',
        case CustomerCode when '7G00348' then sum(qty) else 0 end as '太太乐自贡分公司',
        case CustomerCode when '7G00309' then sum(qty) else 0 end as '太太乐阜阳分公司',
        case CustomerCode when '7G00338' then sum(qty) else 0 end as '太太乐乌鲁木齐分公司',
        case CustomerCode when '7G00337' then sum(qty) else 0 end as '太太乐呼和浩特分公司',
        case CustomerCode when '7G00334' then sum(qty) else 0 end as '太太乐重庆分公司',
        case CustomerCode when '7G00343' then sum(qty) else 0 end as '太太乐深圳分公司',
        case CustomerCode when '7G00345' then sum(qty) else 0 end as '太太乐宜昌分公司',
        case CustomerCode when '7G00344' then sum(qty) else 0 end as '太太乐银川分公司',
        ProductCode  
        from [Bus_Struct_RollingPlan]
    where ImportMonth=12 and PlanMonth=1 and year=2022
    group by CustomerCode,ProductCode) s
    group by ProductCode 
View Code

需要注意的列名是不能有括号的,所以要全部加上中括号。有括号的原因就是,在维护基础数据的时候就有括号,这个无法避免。

原文地址:https://www.cnblogs.com/JellyM/p/15718921.html