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.   

    1# 在动态行专列之前将表里的记录做一个合计
    2# 动态转列后用with rollup 对结果集合计
      

  2.   

    1楼,查询语句如下,
    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 子句,那么前一个语句必须以分号结尾。
      

  3.   

    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)
      

  4.   

    2005:
    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
      

  5.   

    4楼
    sum(dw),sum(qw),sum(sd),sum(ss),sum(we),sum(xc),sum(xs)
    不可以,我只是重商场里面举了个别的几个,而实际有100多的商场,需要用动态列实现。
    列求和3楼帮我解决了,现在需要解决的是行求和。
    1楼
    1# 在动态行专列之前将表里的记录做一个合计
    不知道怎么实现。
      

  6.   

    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 *,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
      

  7.   

    要动态的,实际上dw+qw+sd+ss+we+xc+xs 这些列是不固定的。
      

  8.   

    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 group by dw,qw,sd,ss,we,xc,xs with rollup'
    exec(@sql)
      

  9.   

    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),@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_销售报表
      

  10.   

    晕,用这个查询查询刚才那个表没有问题,可是用我正式查询查出来会出错。
    sum([xxx经贸]),sum([百安居二店]),sum([百安居三店]),sum([百安居一店]),sum([宝丽鸿海尔专卖店]),... ... ... ...sum([中山苏宁])
    消息 105,级别 15,状态 1,第 96 行
    字符串 'xx苏宁' 后的引号不完整。
    消息 102,级别 15,状态 1,第 96 行
    'xx苏宁' 附近有语法错误。
      

  11.   

    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,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列的都删掉。
      

  12.   

    declare @sql varchar(8000) 
    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 行受影响)
    */
      

  13.   

    谢谢qianjin036a(晴天),完全解决了,我增加把所有的列是0的字段删除后,你的代码就好用了。
    是不是这些代码查询出来的字段太多,超过限制之类的原因出错呀。我觉得就是这个原因。
    但,不知道如何解决。
    不过最终你帮我解决了问题。
    非常感谢。
    也谢谢其他人的帮助