sql语句交叉报表实现
2007-09-15 11:36
260 查看
select isnull(aa.ProductSortCode,'')+'`'+ isnull(aa.ProductCode,'') KeyEx
,aa.*,bb.TheName ProductName,bb.ConfigName,ProductSortName,cc.TheName ClientName
into #crosstab
from
(
select a.ProductCode,a.ProductSortCode,b.ClientCode
,Sum(a.Number) Number,Sum(a.SaleMoney) SaleMoney,Sum(a.TotalMoney) TotalMoney
from tbSaleOutItem a
Left Outer Join tbSaleOut b on a.BillNo = b.BillNo
Group by a.ProductCode,a.ProductSortCode,b.ClientCode
) aa
Left Outer Join vDatumProduct bb on aa.ProductCode = bb.TheCode and aa.ProductSortCode=bb.ProductSort
Left Outer Join vDatumAllCustomer cc on aa.ClientCode = cc.TheCode
order by aa.ClientCode
--存储过程:
--1.用sql语句生成需要排序的交叉报表crosstab(a,b,c)需要b(门店)变为行显示,a(商品),c(数量)
--2.例如字段A要交叉显示,注意要对TempCross(b0排序,创建游标,释放游标
declare
@AFiled varchar(50),--分组显示的名称
--交叉表的字段
@BFiled varchar(10),--Tempcross 构成交叉表的字段
@BFiledName varchar(10),-----仓库名称
@TempBField varchar(10),--Tempcross 构成交叉表的字段
@CFiled varchar(10),--分组统计的数据
@sql varchar(8000) --构成sql语句
declare currow cursor for
select ClientCode,ClientName from #crosstab
open currow
---初始化分组的名称
set @AFiled='ProductName,ProductSortName'
--初始化要求的字段
set @CFiled='Number'
set @sql = 'select '+@AFiled --得到A字段信息
fetch next from currow into @BFiled,@BFiledName
set @TempBField=''
while @@fetch_status=0
begin
if @BFiled<>@TempBField
begin
select @sql = @sql +', sum(case ClientCode when ''' + @BFiled + ''' then '+@CFiled+' else 0 end) as ''' + @BFiledName+'`'+@CFiled + ''''
end
set @TempBField=@BFiled
fetch next from currow into @BFiled,@BFiledName
end
set @sql=@Sql+'from #crosstab group by '+@AFiled
print @sql
--3.执行显示结果
exec (@sql)
--4.释放游标
close currow
deallocate currow
--释放临时表
drop table #crosstab
,aa.*,bb.TheName ProductName,bb.ConfigName,ProductSortName,cc.TheName ClientName
into #crosstab
from
(
select a.ProductCode,a.ProductSortCode,b.ClientCode
,Sum(a.Number) Number,Sum(a.SaleMoney) SaleMoney,Sum(a.TotalMoney) TotalMoney
from tbSaleOutItem a
Left Outer Join tbSaleOut b on a.BillNo = b.BillNo
Group by a.ProductCode,a.ProductSortCode,b.ClientCode
) aa
Left Outer Join vDatumProduct bb on aa.ProductCode = bb.TheCode and aa.ProductSortCode=bb.ProductSort
Left Outer Join vDatumAllCustomer cc on aa.ClientCode = cc.TheCode
order by aa.ClientCode
--存储过程:
--1.用sql语句生成需要排序的交叉报表crosstab(a,b,c)需要b(门店)变为行显示,a(商品),c(数量)
--2.例如字段A要交叉显示,注意要对TempCross(b0排序,创建游标,释放游标
declare
@AFiled varchar(50),--分组显示的名称
--交叉表的字段
@BFiled varchar(10),--Tempcross 构成交叉表的字段
@BFiledName varchar(10),-----仓库名称
@TempBField varchar(10),--Tempcross 构成交叉表的字段
@CFiled varchar(10),--分组统计的数据
@sql varchar(8000) --构成sql语句
declare currow cursor for
select ClientCode,ClientName from #crosstab
open currow
---初始化分组的名称
set @AFiled='ProductName,ProductSortName'
--初始化要求的字段
set @CFiled='Number'
set @sql = 'select '+@AFiled --得到A字段信息
fetch next from currow into @BFiled,@BFiledName
set @TempBField=''
while @@fetch_status=0
begin
if @BFiled<>@TempBField
begin
select @sql = @sql +', sum(case ClientCode when ''' + @BFiled + ''' then '+@CFiled+' else 0 end) as ''' + @BFiledName+'`'+@CFiled + ''''
end
set @TempBField=@BFiled
fetch next from currow into @BFiled,@BFiledName
end
set @sql=@Sql+'from #crosstab group by '+@AFiled
print @sql
--3.执行显示结果
exec (@sql)
--4.释放游标
close currow
deallocate currow
--释放临时表
drop table #crosstab
相关文章推荐
- sql 行列转化/交叉报表的实现
- select语句实现交叉报表
- select语句实现交叉报表
- WMS仓储管理系统实现"收发存日报表"数据查询功能Sql语句--Oracle
- SQL交叉报表的实现
- 交叉报表sql语句使用
- SQL 查询语句中交叉条件的应用!
- 水晶报表中几种交叉表的实现方法
- CPT文件怎么打开,CPT报表怎么查看其SQL语句
- sql语句实现模糊搜索
- MyBatis中forEach实现in条件下的集合参数SQL语句
- Yii框架在页面输出执行sql语句以方便调试的实现方法
- SQL语句实现表中字段的组合累加排序
- pig中各种sql语句的实现
- ASP实现SQL语句日期格式的加减运算
- 用sql语句实现分离和附加数据库的方法
- Oracle实现查询时间段的Sql语句两法
- javascript实现多表头分类交叉报表之二:效果图
- 用一条SQL语句实现斐波那契数列
- 通过构建SQL语句实现数据同步