回 帖 发 新 帖 刷新版面

主题:PB检出数据由纵列变换为横向,非常难题,谁能解决,堪称高手

比如由成绩表中检出各学生的成绩,一般是第一列学生名,第二列是学科名,第三列是成绩,如果能做到第一列为学生名,第二\三\四列为各学科名称,成绩相应填入,则表格美观得多,我试了很多方法,做不到.(除非画一张自定义列的DATAWINDOW,然后用函数读入,只是这样太麻烦了)不知哪位高手有什么方便的办法,不要告诉我用CROSSTAB表,那会越来越乱,如果你能解决,我尊称你一声"绝对高手"!!

回复列表 (共4个回复)

沙发

可以这实现:

假设
1.你从表中检索出数据 --- Select name, item, score from ...
2.你的科目item总共有4门科目(多则以此类推...), 其内容分别为 'a', 'b', 'c', 'd'

然后你在PB中新建一个DataWindow:
1.先定义数据源(列名参照上面的SQL中的列名)
2.回到DataWindow的界面设计窗口:
a.在明细栏(Detail Band)放上对象(菜单Object->Column) name
b.在明细栏依次放上以下4个计算列对象(菜单Object->Computed Field):
  score_a,score_b,score_c,score_d
  其定义(Expression)依次为:
     if(item='a',score,0)
     if(item='b',score,0)
     if(item='c',score,0)
     if(item='d',score,0)
c.Header栏添加列标题(如姓名,语文,数学,...)
d.按name列创建分组
e.Mouse 按住 Trailer group 后往下拉出一定空间
f.选中score_a,score_b,score_c,score_d这4列后点击菜单Object->sum
g.点击菜单Object->Computed Field 在name列下方分组尾部栏中添加计算列,其expression为name
h.将明细栏(Detail)向上拉小至看不见(即隐藏)

好了,你想要的效果应该有了!!!

板凳

这种方法只能处理事先知道科目名称的情况

3 楼

实际上如果你后台数据库(如SQL Server)支持的话,你可以直接在从表中检索数据时就得到你想的格式,而省去了在DataWindow 中进一步的任何处理:

select name,
   sum(case(item when 'a' then score else 0)) as score_a,
   sum(case(item when 'b' then score else 0)) as score_b,
   sum(case(item when 'c' then score else 0)) as score_c,
   sum(case(item when 'd' then score else 0)) as score_d
from ...
where ...
group by name
...

这种方法最简单方便,但没有通用性

4 楼

没有做不到,只有想不到

我来回复

您尚未登录,请登录后再回复。点此登录或注册