日期:2014-05-19  浏览次数:20370 次

求一个统计类的交叉报表的SQL语句
A表:
区域,城市,分类1,分类2,分类3,款,sku,销售数量    
北方   ,北京,夏季,登山类,男士,26789,26789-999,100
北方   ,北京,夏季,登山类,男士,26789,26789-000,200
北方   ,河北,夏季,登山类,男士,26789,26789-000,90
北方   ,河北,夏季,登山类,男士,23445,23445-000,120
 
南方   ,上海,夏季,登山类,男士,26789,26789-999,180
南方   ,上海,夏季,登山类,男士,26789,26789-000,280
南方   ,上海,夏季,登山类,男士,26789,26789-000,190
南方   ,上海,夏季,登山类,男士,23445,23445-000,320


B表:
区域,城市,分类1,分类2,分类3,款,sku,库存数量

北方   ,北京,夏季,登山类,男士,26789,26789-999,400
北方   ,北京,夏季,登山类,男士,26789,26789-000,600
北方   ,河北,夏季,登山类,男士,26789,26789-000,900
北方   ,河北,夏季,登山类,男士,23445,23445-000,800
 
南方   ,上海,夏季,登山类,男士,26789,26789-999,460
南方   ,上海,夏季,登山类,男士,26789,26789-000,800
南方   ,上海,夏季,登山类,男士,26789,26789-000,900
南方   ,上海,夏季,登山类,男士,23445,23445-000,860


求:
城市,分类1,分类2,分类3,南方款数量,南方sku数量,南方销售数量,南方库存数量,北方款数量,北方区域sku数量,北方销售数量,北方库存数量

------解决方案--------------------
不知道varchar(8000)够不够

declare @sql varchar(8000)
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
declare @sql3 varchar(8000)
set @sql= ' '
set @sql1= ' '
set @sql2= ' '
set @sql3= ' '
select @sql=@sql+ ',sum(case when 区域= ' ' '+区域+ ' ' ' and 款= ' ' '+款+ ' ' ' then 销售数量 end 0 end) as [ '+区域+款+ '数量] '
from a
group by 区域,款

select @sql1=@sql1+ ',sum(case when 区域= ' ' '+区域+ ' ' ' and 款= ' ' '+sku+ ' ' ' then 销售数量 end 0 end) as [ '+区域+sku+ '数量] '
from a
group by 区域,sku

select @sql2=@sql2+ ',sum(case when 区域= ' ' '+区域+ ' ' ' then 销售数量 end 0 end) as [ '+区域+ '数量] '
from a
group by 区域

select @sql3=@sql3+ ',sum(case when 区域= ' ' '+区域+ ' ' ' then 库存数量 end 0 end) as [ '+区域+ '库存数量] '
from b
group by 区域

exec( 'select 城市,分类1,分类2,分类3 '+@sql+@sql1+@sql2+@sql3+ ' from (
select *,cast(0 as numeric(18,2)) as 库存数量 from a union all select 区域,城市,分类1,分类2,分类3,款,sku,0 as 销售数量,库存数量 from b) as t group by 城市,分类1,分类2,分类3 ')


------解决方案--------------------
你的问题提的好像本身就有问题!你自己想想!如果把“城市”放在第一个字段,那就已经区分出了南方和北方,后面怎么会又同时存在南方的数量和北方的数量呢??