CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

高难度:行列转换?

楼主Adnil(IT闲人)2001-09-07 20:22:01 在 MS-SQL Server / 基础类 提问

如今碰到这样一个问题:  
   
  表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

相关问题

  • 高难度的字节转换问题
  • 行列转换
  • 行列转换
  • 行列转换
  • 高难度问题:如何将WORD文档转换成HTML文档,急用!!!
  • 一个高难度的问题,关于字符集的字节转换
  • 行列转换的问题
  • 表的行列转换
  • 行列转换问题
  • 再求行列转换

关键词

  • 用户
  • 性别
  • 年龄
  • 表
  • email
  • 姓名
  • username
  • where
  • 编号
  • 男

得分解答快速导航

  • 帖主:Adnil
  • smartdonkey
  • leeyoong
  • pxq
  • lizhen

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo