报表开发难题,跪求高人指教!

amanloveyou 2006-04-04 09:09:08
现做一综合报表A
所需表结构说明:表B
datetime batch inspitem inspresult samplenum
2005-2-21 10001 AA 0.5 1
2005-2-21 10001 AA 0.6 2
2005-2-21 10001 BB 1.0 1
2005-2-21 10001 CC 2.0 1
2005-2-21 10001 DD 1.5 1
2005-2-21 10001 EE 0.5 1
2005-2-21 10001 FF 1.0 1
2005-2-21 10001 FF 2.0 2
2005-2-21 10002 AA 0.5 1
2005-2-21 10002 AA 0.6 2
2005-2-21 10002 CC 2.0 1
2005-2-21 10002 DD 1.5 1
2005-2-21 10002 EE 0.5 1
2005-2-21 10002 FF 1.0 1
2005-2-21 10002 FF 2.0 2
2005-2-21 10003 AA 0.6 1
2005-2-21 10003 AA 0.6 2
2005-2-21 10003 CC 2.0 1
2005-2-21 10003 EE 0.5 1
2005-2-21 10003 GG 1.0 1
2005-2-21 10003 GG 2.0 2
注释:其中检测项目inspitem 的集合为(AA BB CC DD EE FF GG)
但是batch中每个号对应的检测内容inspitem 并不完全相同,如上
所示。 要求:将表B的格式改为如下格式形成报表A:
datetime batch AA AA BB CC DD EE FF FF GG GG 的格式。
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
十一月猪 2006-04-08
  • 打赏
  • 举报
回复
如果 横的是由两列共同决定
上面的存储过程可以解决吗?
momo21704 2006-04-07
  • 打赏
  • 举报
回复
看看我这个存储过程吧.可以达到行列转换..还可以纵,横向求和.

--drop proc p_qry
CREATE proc p_qry
@TableName sysname, --表名
@纵轴 sysname, --交叉表最左面的列
@横轴 sysname, --交叉表最上面的列
@表体内容 sysname, --交叉表的数数据字段
@是否加横向合计 bit,--为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar(4000),@sql varchar(8000)

--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
set @s='declare @a sysname
if(select case when count(distinct ['+@纵轴+'])<count(distinct ['+@横轴+']) then 1 else 0 end
from ['+@TableName+'])=1
select @a=@纵轴,@纵轴=@横轴,@横轴=@a'
exec sp_executesql @s
,N'@纵轴 sysname out,@横轴 sysname out'
,@纵轴 out,@横轴 out

--生成交叉表处理语句
set @s='
set @s=''''
select @s=@s+'',[''+cast(['+@横轴+'] as varchar)+'']=sum(case ['+@横轴
+'] when ''''''+cast(['+@横轴+'] as varchar)+'''''' then ['+@表体内容+'] else 0 end)''
from ['+@TableName+']
group by ['+@横轴+']'
exec sp_executesql @s
,N'@s varchar(8000) out'
,@sql out

--是否生成合计字段的处理
declare @sum1 varchar(200),@sum2 varchar(200),@sum3 varchar(200)
select @sum1=case @是否加横向合计
when 1 then ',[合计]=sum(['+@表体内容+'])'
else '' end
,@sum2=case @是否家纵向合计
when 1 then '['+@纵轴+']=case grouping(['
+@纵轴+']) when 1 then ''合计'' else cast(['
+@纵轴+'] as varchar) end'
else '['+@纵轴+']' end
,@sum3=case @是否家纵向合计
when 1 then ' with rollup'
else '' end

--生成交叉表
exec('select '+@sum2+@sql+@sum1+'
from ['+@TableName+']
group by ['+@纵轴+']'+@sum3+' Order By ['+@纵轴+'], Len(['+@纵轴+']) Desc ' )
GO
momo21704 2006-04-07
  • 打赏
  • 举报
回复
你的意思就是把一个表行列转换罗

可以写个这么个存储过程.
amanloveyou 2006-04-04
  • 打赏
  • 举报
回复
结果为:
datetime batch AA AA BB CC DD EE FF FF GG GG
2005-2-21 10001 0.5 0.6 1.0 2.0 1.5 0.5 1.0 2.0 0.0 0.0
2005-2-21 10002 0.5 0.6 0.0 2.0 1.5 0.5 1.0 2.0 0.0 0.0
2005-2-21 10003 0.6 0.6 0.0 2.0 0.0 0.5 0.0 0.0 1.0 2.0

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧