用到水晶报表交叉表的问题

cxqhust1 2003-12-02 09:11:02
我想设计如下的统计表:

学号 姓名 英语 数学 。。。。。

001 xx 90 80 。。。。。
002 xx 80 80 。。。。。

现在采用的办法是用交叉表,但是不能有“学号”,只能有如下的样子,怎么解决呢,谢谢! BTW:交叉表导出那些线框还在吗?

姓名 英语 数学 。。。。。

xx 90 80 。。。。。
xx 80 80 。。。。。
...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxqhust1 2003-12-02
  • 打赏
  • 举报
回复
谢谢!
To X_Pan(滨海浪子) : 你的代码段可以画线吗?我不会VB.NET.
请问有可能把交叉表导出还保留线框吗?
X_Pan 2003-12-02
  • 打赏
  • 举报
回复
用如下过程即可,

CREATE PROCEDURE P_CrossTab --交叉表生成器
@vSourceTAB As Varchar(200), --数据来源表,可以为表,视图,或者SQL语句(要用括号以及别名:如上注释段)
@vGroupbyField As Varchar(1000), --被selct Group By 要显示出来的,可以多个字段(记录可以有空值)
@vTransFormCol As Varchar(500), --交叉表中的合计等函数计算值的字段
@vFunction As Varchar(500)='Sum', --默认值,交叉表中的函数,也可以是' 2*Sum'的计算公式
@vPivotCol As Varchar(500), --要转换成列的字段,唯一列,可以是表达式'Field1+Field2'(记录可以有空值)
@vStrWhere As Varchar(1000)=null,--Where 约束条件,可以为空
@AggreGate as Varchar(1000)=null--聚集列,不会放到groupby里面
AS
Declare @StrSql As Varchar(8000) --//总的SQL语句
Declare @StrSql2 As Varchar(8000)--//怕varchar(8000)不够长,我就遇到超过8000的问题
Declare @StrSql3 As Varchar(8000)--//加长总SQL语句
Declare @StrSql4 As Varchar(8000)--//加长总SQL语句
Declare @StrSql5 As Varchar(8000)--//加长总SQL语句
Declare @StrSum As Varchar(650) --//列合计
Declare @pCols As Varchar(8000)
Declare @StrWhere As Varchar(1000)
IF Rtrim(Ltrim(IsNull(@vStrWhere,''))) <> ''
Begin
Set @StrWhere=' Where ' + @vStrWhere + ' '
End
Else
Set @StrWhere=''
Execute('Declare CursorCross Cursor For
Select Distinct ' + @vPivotCol + ' From ' +@vSourceTAB+' '+@StrWhere+' Order By ' + @vPivotCol + ' For Read only ')
Begin
Set Nocount On
Set @StrSql =' '
Set @StrSql2=' '
Set @StrSql3=' '
Set @StrSql4=' '
Set @StrSql5=' '

Open CursorCross
While (0=0)
Begin
Fetch Next From CursorCross Into @pCols
IF (@@Fetch_Status<>0) Break
IF @pCols Is Null --//不为空值,
Set @pCols='Null'
--为了防止新创建的列的标题名称,与@vGroupbyField中的字段重名,
--新创建的列的标题名称都增加前缀[@vGroupbyField.新创建的列的标题名称]
--因Sql长度限制Max=8000,由源数据控制字段值不能为Null,因此这里不再检验值是否为Null
if len(@StrSql)>6000 and len(@StrSql2)>6000 and len(@StrSql3)>6000 and len(@StrSql4)>6000 and len(@StrSql5)<6000
Set @StrSql5=@StrSql5+',' + @vFunction +
'(Case '+@vPivotCol+' When ' + ''''+@pCols+''''+ ' Then '+@vTransFormCol +' End) As'+'['+@pCols+']'
if len(@StrSql)>6000 and len(@StrSql2)>6000 and len(@StrSql3)>6000 and len(@StrSql4)<6000
Set @StrSql4=@StrSql4+',' + @vFunction +
'(Case '+@vPivotCol+' When ' + ''''+@pCols+''''+ ' Then '+@vTransFormCol +' End) As'+'['+@pCols+']'
if len(@StrSql)>6000 and len(@StrSql2)>6000 and len(@StrSql3)<6000
Set @StrSql3=@StrSql3+',' + @vFunction +
'(Case '+@vPivotCol+' When ' + ''''+@pCols+''''+ ' Then '+@vTransFormCol +' End) As'+'['+@pCols+']'
if len(@StrSql)>6000 and len(@StrSql2)<6000
Set @StrSql2=@StrSql2+',' + @vFunction +'(Case '+@vPivotCol+' When ' + ''''+@pCols+''''+ ' Then '+@vTransFormCol +' End) As'+'['+@pCols+']'
if len(@StrSql)<6000
Set @StrSql=@StrSql +',' + @vFunction +'(Case '+@vPivotCol+' When ' + ''''+@pCols+''''+ ' Then '+@vTransFormCol +' End) As'+'['+@pCols+']'

End
Close CursorCross
Deallocate CursorCross

-- print ('Select '+@vGroupByField+' '+@StrSql2)+@StrSql+' From '+@vSourceTAB+' '+@StrWhere+' Group By '+@vGroupByField)
--print @strsql3

if @AggreGate is null
Execute(' Select '+@vGroupByField+' '+@StrSql+@StrSql2+@StrSql3+@StrSql4+@StrSql5+' From '+@vSourceTAB+' '+@StrWhere+' Group By '+@vGroupByField)
else
Execute(' Select '+@vGroupByField+','+@AggreGate+' '+@StrSql+@StrSql2+@StrSql3+@StrSql4+@StrSql5+' From '+@vSourceTAB+' '+@StrWhere+' Group By '+@vGroupByField)

IF @@Error <>0
Return @@Error
Return 0
End

tnt8csdn2000 2003-12-02
  • 打赏
  • 举报
回复
在数据链接的时候,用学号来链接,选择行值时用姓名。

导出时线是没有的。
ZXYSOSO 2003-12-02
  • 打赏
  • 举报
回复
你用报表的精灵一步一步试下
行是姓名,列是课目,值是分数。
cxqhust1 2003-12-02
  • 打赏
  • 举报
回复
呜呜呜,没人碰到过吗?

62,133

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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