ID 实销单位 商品 成交价
1 QW W 1520
2 WE E 1250
3 DW E 1520
4 SD F 225
5 XS E 235
6 XC W 252
7 SS Q 252
8 WE W 352现在可以用以下语句交叉查询,
declare @sql varchar(8000) set @sql = 'select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品' exec(@sql)但还需要查询出汇总,需要的结果如下:商品 QW WE DW SD XS XC SS WE 合计
W 1520 0 0 0 0 252 0 352 2124
E 0 1250 1520 0 235 0 0 0 3005
F 0 0 0 225 0 0 0 0 225
Q 0 0 0 0 0 0 252 0 252
合计 1520 1250 1520 225 235 252 252 352 5606
1 QW W 1520
2 WE E 1250
3 DW E 1520
4 SD F 225
5 XS E 235
6 XC W 252
7 SS Q 252
8 WE W 352现在可以用以下语句交叉查询,
declare @sql varchar(8000) set @sql = 'select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品' exec(@sql)但还需要查询出汇总,需要的结果如下:商品 QW WE DW SD XS XC SS WE 合计
W 1520 0 0 0 0 252 0 352 2124
E 0 1250 1520 0 235 0 0 0 3005
F 0 0 0 225 0 0 0 0 225
Q 0 0 0 0 0 0 252 0 252
合计 1520 1250 1520 225 235 252 252 352 5606
2# 动态转列后用with rollup 对结果集合计
declare @sql varchar(8000) set @sql = 'select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品' with rollup
exec(@sql)出错:消息 319,级别 15,状态 1,第 7 行
关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品 with rollup' --这里
exec(@sql)
create table view_销售报表(ID int,实销单位 nvarchar(10),商品 nvarchar(10),成交价 int,销售月 int,品牌ID int)
insert into view_销售报表 select 1,'QW','W',1520,201105,1
insert into view_销售报表 select 2,'WE','E',1250,201105,1
insert into view_销售报表 select 3,'DW','E',1520,201105,1
insert into view_销售报表 select 4,'SD','F',225,201105,1
insert into view_销售报表 select 5,'XS','E',235,201105,1
insert into view_销售报表 select 6,'XC','W',252,201105,1
insert into view_销售报表 select 7,'SS','Q',252,201105,1
insert into view_销售报表 select 8,'WE','W',352,201105,1
go
declare @sql varchar(8000) set @sql = ';with cte as(select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品'+
')select * from cte union all select ''合计'',sum(dw),sum(qw),sum(sd),sum(ss),sum(we),sum(xc),sum(xs) from cte'
exec(@sql)
/*
商品 DW QW SD SS WE XC XS
---------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
E 1520 0 0 0 1250 0 235
F 0 0 225 0 0 0 0
Q 0 0 0 252 0 0 0
W 0 1520 0 0 352 252 0
合计 1520 1520 225 252 1602 252 235(5 行受影响)
*/
go
sum(dw),sum(qw),sum(sd),sum(ss),sum(we),sum(xc),sum(xs)
不可以,我只是重商场里面举了个别的几个,而实际有100多的商场,需要用动态列实现。
列求和3楼帮我解决了,现在需要解决的是行求和。
1楼
1# 在动态行专列之前将表里的记录做一个合计
不知道怎么实现。
insert into view_销售报表 select 1,'QW','W',1520,201105,1
insert into view_销售报表 select 2,'WE','E',1250,201105,1
insert into view_销售报表 select 3,'DW','E',1520,201105,1
insert into view_销售报表 select 4,'SD','F',225,201105,1
insert into view_销售报表 select 5,'XS','E',235,201105,1
insert into view_销售报表 select 6,'XC','W',252,201105,1
insert into view_销售报表 select 7,'SS','Q',252,201105,1
insert into view_销售报表 select 8,'WE','W',352,201105,1
go
declare @sql varchar(8000) set @sql = ';with cte as(select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品'+
')select *,dw+qw+sd+ss+we+xc+xs 合计 from cte union all select ''总计'',sum(dw),sum(qw),sum(sd),sum(ss),sum(we),sum(xc),sum(xs),sum(dw)+sum(qw)+sum(sd)+sum(ss)+sum(we)+sum(xc)+sum(xs) from cte'
exec(@sql)
/*
商品 DW QW SD SS WE XC XS 合计
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
E 1520 0 0 0 1250 0 235 3005
F 0 0 225 0 0 0 0 225
Q 0 0 0 252 0 0 0 252
W 0 1520 0 0 352 252 0 2124
总计 1520 1520 225 252 1602 252 235 5606(5 行受影响)
*/
go
set @sql = ';with cte as(select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品'+
')select *,dw+qw+sd+ss+we+xc+xs 合计 from cte group by dw,qw,sd,ss,we,xc,xs with rollup'
exec(@sql)
insert into view_销售报表 select 1,'QW','W',1520,201105,1
insert into view_销售报表 select 2,'WE','E',1250,201105,1
insert into view_销售报表 select 3,'DW','E',1520,201105,1
insert into view_销售报表 select 4,'SD','F',225,201105,1
insert into view_销售报表 select 5,'XS','E',235,201105,1
insert into view_销售报表 select 6,'XC','W',252,201105,1
insert into view_销售报表 select 7,'SS','Q',252,201105,1
insert into view_销售报表 select 8,'WE','W',352,201105,1
go
declare @sql varchar(8000),@sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000)
set @sql = ';with cte as(select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']',@sql1=isnull(@sql1+'+','')+'[' + 实销单位 + ']',
@sql2=isnull(@sql2+',','')+'sum([' + 实销单位 + '])',
@sql3=isnull(@sql3+'+','')+'sum([' + 实销单位 + '])' from (select distinct
实销单位 from View_销售报表) as a
print @sql2
set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品'+
')select *,'+ @sql1+' 合计 from cte union all select ''总计'','+@sql2+','+@sql3+' from cte'
exec(@sql)
/*
商品 DW QW SD SS WE XC XS 合计
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
E 1520 0 0 0 1250 0 235 3005
F 0 0 225 0 0 0 0 225
Q 0 0 0 252 0 0 0 252
W 0 1520 0 0 352 252 0 2124
总计 1520 1520 225 252 1602 252 235 5606(5 行受影响)
*/
go
drop table view_销售报表
sum([xxx经贸]),sum([百安居二店]),sum([百安居三店]),sum([百安居一店]),sum([宝丽鸿海尔专卖店]),... ... ... ...sum([中山苏宁])
消息 105,级别 15,状态 1,第 96 行
字符串 'xx苏宁' 后的引号不完整。
消息 102,级别 15,状态 1,第 96 行
'xx苏宁' 附近有语法错误。
insert into view_销售报表 select 1,'QW','W',1520,201105,1
insert into view_销售报表 select 2,'WE','E',1250,201105,1
insert into view_销售报表 select 3,'DW','E',1520,201105,1
insert into view_销售报表 select 4,'SD','F',225,201105,1
insert into view_销售报表 select 5,'XS','E',235,201105,2
insert into view_销售报表 select 6,'XC','W',252,201105,2
insert into view_销售报表 select 7,'SS','Q',252,201105,1
insert into view_销售报表 select 8,'WE','W',352,201105,1declare @sql varchar(8000) set @sql = 'select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + '''
then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表) as a set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品 with rollup'
exec(@sql)结果
E 1520 0 0 0 1250 0 0
F 0 0 225 0 0 0 0
Q 0 0 0 252 0 0 0
W 0 1520 0 0 352 0 0
NULL 1520 1520 225 252 1602 0 0
能不能把这全部都是0列的都删掉。
set @sql = 'select 商品 '
select @sql = @sql + ' , sum(case 实销单位 when ''' + 实销单位 + ''' then 成交价 else 0 end) [' + 实销单位 + ']' from (select distinct
实销单位 from View_销售报表 where 品牌ID = 1) as a
set @sql = @sql + '
from View_销售报表
WHERE 销售月 = 201105 and
品牌ID = 1 group by 商品 with rollup'
exec(@sql)
/*
商品 DW QW SD SS WE
---------- ----------- ----------- ----------- ----------- -----------
E 1520 0 0 0 1250
F 0 0 225 0 0
Q 0 0 0 252 0
W 0 1520 0 0 352
NULL 1520 1520 225 252 1602(5 行受影响)
*/
是不是这些代码查询出来的字段太多,超过限制之类的原因出错呀。我觉得就是这个原因。
但,不知道如何解决。
不过最终你帮我解决了问题。
非常感谢。
也谢谢其他人的帮助