纵向行记录,横向显示,进来看看......
现在遇到一个问题:
表1表示结构:
项目ID,项目名称
001 基本工资
002 高温补贴
003 ...
表2表示值:
人员ID,项目ID,值
1001 001 1000.00
1001 002 200.00
1001 003 ...
1002 001 1200.00
1002 002 200.00
... ...
现在要显示为以下格式:
人员ID,基本工资 高温补贴 ... ...
1001 1000.00 200.00 ...
1002 1200.00 200.00 ...
... ...
我把它称之为纵向设计,横向展现。使用这样的设计是为了可以动态增加项目,但在展现给用户看时,就比较困难,不知各位可否给点建议?
问题点数:72、回复次数:21Top
1 楼dbcontrols(泰山__抛砖引玉)回复于 2001-11-26 15:08:56 得分 0
把数据写到EXCEL
欢迎访问http://go8.163.com/dbcontrolsTop
2 楼pans(土豆)回复于 2001-11-26 16:17:07 得分 0
用 Cross-tab可以显示出来,但让用户在何种状态下编辑,是个问题。用Excel,用户非急不可!Top
3 楼mycode(不写代码)回复于 2001-11-26 16:46:56 得分 0
不要用SQL语句来解决.而在采用其他编程语言,构造查询语句来进行显示.
我觉得单纯用SQL语句可能不能解决.
Top
4 楼IronPromises(铁诺)回复于 2001-11-26 16:55:05 得分 0
可以做到.但比较的繁琐.
我是不想写.
Top
5 楼yaojl(探讨探讨)回复于 2001-11-26 16:56:59 得分 0
不是很难,如果是oracle的话Top
6 楼icevi(按钮工厂)回复于 2001-11-26 17:10:57 得分 7
什么数据库?不同的数据库解决办法不一样。
以前很多这样的贴子。最好查一下。Top
7 楼argin(猫眉毛)回复于 2001-11-26 17:33:32 得分 0
自己写一个存储过程不就得了
不要老是想着偷懒!Top
8 楼pans(土豆)回复于 2001-11-26 17:36:40 得分 0
谢谢各位的回答!
To mycode:
我考虑过,有两种方式,其一是后台构建临时表(显示方式)。其二是前台编码生成显示格式。如果,前台写代码的话,大数据量时,会很难受的。而且还要自己写数据更新代码,工程浩大。后台方式,没想出来。
To IronPromises(铁诺) :
给个提示,好不好?
To yaojl(探讨探讨) :
这于后台数据库关系很大吗? 如果,是Oracle,如何处理?
To icevi(按钮工厂)(女) :
我有查,不过没有找到。Top
9 楼argin(猫眉毛)回复于 2001-11-26 19:24:51 得分 40
这个无非是个交叉表,用存储过程解决!
我以前解答过了!
请参见:
http://www.csdn.net/expert/topic/328/328512.shtm
只不过列表头稍微自己修改一下!Top
10 楼argin(猫眉毛)回复于 2001-11-26 19:33:22 得分 5
这是个很通用的存储过程!(只不过你要认真看一下,读懂它)Top
11 楼yaojl(探讨探讨)回复于 2001-11-26 21:20:33 得分 5
以前开发的时候经常这样干,在oracle里好象有数据转至的函数;查查手册!Top
12 楼pans(土豆)回复于 2001-11-27 10:38:37 得分 0
To argin(猫眉毛):
你的存储过程的确很好用。在下佩服,佩服,俺看明白了。谢谢你的帮助,先来30分。
再问一下,这种设计时,我们如何让用户编辑数据呢?我们不管是用crystal rep的交叉报表,还是象“猫眉毛”兄写存储过程,呈现在用户眼前的,都是不可编辑的。
如果象工资单,有20多项工资项目,在横向方式编辑是他们的习惯。如果把50人的记录,按纵向方向呈现在用户眼前(在一页上),让他编辑数据,俺担心有命跟他说,没命回呀。
各位,再给俺一点提示。这个帖子,我再加分,一定。
Top
13 楼pans(土豆)回复于 2001-11-27 10:42:07 得分 0
To argin(猫眉毛):
不好意思,俺不知道,不能分开给分。结帖是再加好了。Top
14 楼liu7537(数据库模型设计博客连载(http://blog.csdn.net/liu7537))回复于 2001-11-27 14:31:47 得分 5
别忘了ORACLE中最有力的武器“DECODE()”!
有了它,你的那个要求就迎刃而解了。Top
15 楼xinpingf(白开心)回复于 2001-11-27 15:14:12 得分 10
视图:
create or replace view v_gz as
select 人员id,
sum(decode(项目id,‘001’,值)) 基本工资 ,
sum(decode(项目id,‘002’,值)) 高温补贴 ,
...
from table2
group by 人员id;
一切ok
Top
16 楼pans(土豆)回复于 2001-11-27 16:58:21 得分 0
谢谢各位,数据显示是没有问题了。
现在的问题是,用户在何种形式下编辑数据?如我上面所说Top
17 楼liujianjun_(流星尔)回复于 2001-11-27 17:13:08 得分 0
to 白开心:
你这个视图写法是在oracle里的是吗Top
18 楼blackfiles(一个和尚挑水喝)回复于 2001-11-28 10:33:29 得分 0
看看Top
19 楼pans(土豆)回复于 2001-11-28 11:56:51 得分 0
如果要用户在横向显示的方式下编辑数据,看样子,只能在前台写代码,自己更新。
如,在DataSet中,判断某一行是否被修改,如果被修改,根据人员ID,列名写Update更新回去。
这种方法,应该可行吧!Top
20 楼argin(猫眉毛)回复于 2001-11-29 17:08:46 得分 0
返回的记录集是不可更新的!
前台程序处理:
将数据显示在GRID中
cell(row,col)的内容变了时
根据行和列,修改数据库后
在显示到GRID中!
(注意NULL的情况)
Top
21 楼pans(土豆)回复于 2001-11-30 09:05:24 得分 0
我知,我知,谢谢提醒。
在有些编程工具里,可以自己写每一行的更新方法(如在事件中写代码)。
Top




