主题:PB检出数据由纵列变换为横向,非常难题,谁能解决,堪称高手
wshpt
[专家分:0] 发布于 2005-01-23 21:50:00
比如由成绩表中检出各学生的成绩,一般是第一列学生名,第二列是学科名,第三列是成绩,如果能做到第一列为学生名,第二\三\四列为各学科名称,成绩相应填入,则表格美观得多,我试了很多方法,做不到.(除非画一张自定义列的DATAWINDOW,然后用函数读入,只是这样太麻烦了)不知哪位高手有什么方便的办法,不要告诉我用CROSSTAB表,那会越来越乱,如果你能解决,我尊称你一声"绝对高手"!!
回复列表 (共4个回复)
沙发
LittleMud [专家分:440] 发布于 2005-02-16 17:01:00
可以这实现:
假设
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)向上拉小至看不见(即隐藏)
好了,你想要的效果应该有了!!!
板凳
LittleMud [专家分:440] 发布于 2005-02-16 17:02:00
这种方法只能处理事先知道科目名称的情况
3 楼
LittleMud [专家分:440] 发布于 2005-02-16 17:17:00
实际上如果你后台数据库(如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 楼
LittleMud [专家分:440] 发布于 2005-02-16 17:18:00
没有做不到,只有想不到
我来回复