高难度:行列转换?
如今碰到这样一个问题:
表1:Users(每个用户一条纪录)
列:U_ID(主键), U_Username
数据
1 '王五'
2 '赵六'
.......
表2:User_Value(每个用户变量一条纪录)
列:U_ID(外键), V_Name, V_Value
例子
1 '性别' '男'
1 '年龄' '26'
1 'Email' 'wangfive@xxx.com'
.....
2 '性别' '男'
2 '年龄' '38'
2 'Email' 'zhaoliu@xxx.com'
现在想通过一个存储过程或者视图将用户以及所有用户属性用一张表表示出来
例如
编号|姓名|性别|年龄|Email
1 王五 男 26 wangfive@xxx.com
2.................................
请问该如何实现?
我的邮件adnil.zhou@hdtworld.com,Thanks in advance。
问题点数:20、回复次数:14Top
1 楼Adnil(IT闲人)回复于 2001-09-07 20:29:03 得分 0
Help! :OTop
2 楼smartdonkey(聪明的毛驴)回复于 2001-09-07 21:33:57 得分 8
1.子查询
select t1.U_ID as 编号,t1.U_Username as 姓名,
性别=(select t2.v_value from user_value t2 where t2.U_ID=t1.U_ID and t2.V_Name='性别'),
年龄=(select t2.v_value from user_value t2 where t2.U_ID=t1.U_ID and t2.V_Name='年龄'),
Email=(select t2.v_value from user_value t2 where t2.U_ID=t1.U_ID and t2.V_Name='Email')from users t1
-------------------------------------
Top
3 楼Adnil(IT闲人)回复于 2001-09-07 22:37:23 得分 0
谢谢,我试试看!
其实v_name这些还有一张表对应,有个v_idTop
4 楼mycode(不写代码)回复于 2001-09-07 23:24:20 得分 0
Create Or Replace View View_Name
As
Select A.U_Id,U_UserName,V_Name, V_Value
From Users A,User_Value B
Where A.u_Id=B.U_ID
Top
5 楼Adnil(IT闲人)回复于 2001-09-08 17:36:02 得分 0
to mycode:
你这样没有用的,没有把表2的行转成列。Top
6 楼leeyoong(莫西)回复于 2001-09-08 23:03:28 得分 2
select U_ID as 编号, U_Username as 姓名,'' as 性别,0 as 年龄,'' as Email
into temp_table from users
update temp_table
set 性别=(case when User_Value.V_Name='性别' then User_Value.V_Value
),年龄=(case when User_Value.V_Name='年龄' then User_Value.V_Value
),Email=(case when User_Value.V_Name='Email' then User_Value.V_Value
) from User_Value where temp_table.编号=User_Value.U_ID
select * from temp_tableTop
7 楼pxq(风轻轻地吹)回复于 2001-09-09 00:46:40 得分 8
select a._UID, a.U_Username , b.V_Value , c.V_Value , d.V_Value from Users a , User_Value b , User_Value c , User_Value d where
a.U_ID = b.U_ID and b.V_name = '性别' and
a.U_ID = c.U_ID and c.V_name = '年龄' and
a.U_ID = d.U_ID and d.V_name = 'EMail'
这样应该可以,不知道有没有更好的方法。
Top
8 楼lizhen(大头)回复于 2001-09-09 02:54:08 得分 2
楼上的朋友,这种方法完全可行,如果用游标依次取出User_value中子段V_Value中的数据
select distinct b.v_name from users a, user_value b where a.v_id = b.v_id;
那在语句中就不用写死了。
不知可否行得通?只是想法,还没实现。
Top
9 楼Adnil(IT闲人)回复于 2001-09-09 16:45:39 得分 0
嗯,方法完全可行的。 但是我现在的'性别'、'年龄'、'EMail' 等信息实际上是存放在其他表(假设是表X)中的,USER_VALUE表中只是用ID,是否有办法把变量表信息从表X中全部读出,然后再进行查询? 这样如果表X进行了修改,结果马上就能体现出来。
Top
10 楼Adnil(IT闲人)回复于 2001-09-09 16:46:20 得分 0
感谢各位的相助,问题解决后马上给你们加分 :)Top
11 楼smartdonkey(聪明的毛驴)回复于 2001-09-09 17:37:51 得分 0
好办,你可以蒋user_value表与X表联结即可.
select t1.U_ID as 编号,t1.U_Username as 姓名,
性别=(select t2.v_value from (select u.v_value from x,user_value u where x.u_id=u.u_id) t2 where t2.U_ID=t1.U_ID and t2.V_Name='性别'),
年龄=(select t2.v_value from (select u.v_value from x,user_value u where x.u_id=u.u_id) t2 where t2.U_ID=t1.U_ID and t2.V_Name='年龄'),
Email=(select t2.v_value from (select u.v_value from x,user_value u where x.u_id=u.u_id) t2 where t2.U_ID=t1.U_ID and t2.V_Name='Email')from users t1
另外
若你你的user_value标仅仅有id或仅仅用id的话,而且user_value也有u_id的话,那么user_value表就不要用了,用X就行了
Top
12 楼clwyf(芯片)回复于 2001-09-09 19:23:13 得分 0
你的要求可以用access中交叉表查询(crosstable query)实现,而且特别方便.
Top
13 楼Adnil(IT闲人)回复于 2001-09-09 21:10:45 得分 0
OK,差不多搞定了,给分!Top
14 楼Adnil(IT闲人)回复于 2001-09-09 21:12:08 得分 0
8+8+4Top




