`
albb0608
  • 浏览: 63370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

前天笔试碰到的一个题,是列转行的,大家帮看看

阅读更多
前天笔试碰到的一个题,是列转行的,我把SQL贴出来,大家帮我看看,功能是实现了,不知道是否符合要求。
CREATE TABLE userinfo(
id NUMBER,
NAME VARCHAR2(20)
)

CREATE TABLE userdetail(
id NUMBER,
user_id NUMBER,
user_data VARCHAR2(20),
VALUE VARCHAR2(50)
)

INSERT INTO userinfo (id,NAME) VALUES(1,'张三');
INSERT INTO userinfo (id,NAME) VALUES(2,'李四');
INSERT INTO userinfo (id,NAME) VALUES(3,'王五');
COMMIT;


INSERT INTO userdetail (id,USER_ID,USER_DATA,VALUE) VALUES(1,1,'地址','北京市');
INSERT INTO userdetail (id,USER_ID,USER_DATA,VALUE) VALUES(2,1,'电话','123124324324');
INSERT INTO userdetail (id,USER_ID,USER_DATA,VALUE) VALUES(3,2,'证件号','23423423423423423');
INSERT INTO userdetail (id,USER_ID,USER_DATA,VALUE) VALUES(4,3,'邮编','133012');
INSERT INTO userdetail (id,USER_ID,USER_DATA,VALUE) VALUES(5,3,'QQ','567675767');
COMMIT;


SELECT a.NAME AS 姓名,
NVL((SELECT b.VALUE FROM userdetail b WHERE USER_DATA='地址' AND a.ID=b.USER_ID),'空') AS 地址,
NVL((SELECT c.VALUE FROM userdetail c WHERE USER_DATA='电话' AND a.ID=c.USER_ID),'空') AS 电话,
NVL((SELECT d.VALUE FROM userdetail d WHERE USER_DATA='证件号' AND a.ID=d.USER_ID),'空') AS 证件号,
NVL((SELECT e.VALUE FROM userdetail e WHERE USER_DATA='QQ' AND a.ID=e.USER_ID),'空') AS QQ,
NVL((SELECT f.VALUE FROM userdetail f WHERE USER_DATA='邮编' AND a.ID=f.USER_ID),'空') AS 邮编
FROM
(SELECT * FROM userinfo ) a
分享到:
评论
21 楼 wxno1 2011-04-18  
阳光晒晒 写道
wxno1 写道
decode 解决一切行转列,可惜只有oracle能使

case when ???



还真没使过case when 学习了
20 楼 阳光晒晒 2011-04-15  
wxno1 写道
decode 解决一切行转列,可惜只有oracle能使

case when ???
19 楼 xici_magic 2011-04-14  
Case函数能解决。
18 楼 ganjp 2011-04-14  
咦……哈哈
17 楼 qiang106 2011-04-14  
好像Oracle、MySQL 用case可以,SQLServer没试过
16 楼 albb0608 2011-04-14  
谢谢大家,受益匪浅
15 楼 wxno1 2011-04-13  
decode 解决一切行转列,可惜只有oracle能使
14 楼 thomaswen151 2011-04-12  
select u1.name,
       --d.user_data,
       --d.value
          max( decode(d.user_data, '地址', d.value, '')) 地址,
          max( decode(d.user_data, '电话', d.value, '')) 电话,
          max( decode(d.user_data, '证件号', d.value, '')) 证件号,
          max( decode(d.user_data, '邮编', d.value, '')) 邮编,
          max( decode(d.user_data, 'QQ', d.value, '')) QQ
  from userinfo u1, userdetail d
where u1.id = d.user_id
group by u1.name
;
13 楼 yellow0323 2011-04-12  
decode可以
12 楼 borland 2011-04-11  
用decode啊,easy
11 楼 kisbo110 2011-04-09  
考的是sql语句的行列转换
10 楼 jackra 2011-04-08  
select
id,
max(case
   when user_data='QQ' then value
end)  QQ,
[other same]....
from userdetail
group by id
9 楼 为爱Debug 2011-04-08  
zhoutao_0116 写道
SELECT NAME AS 姓名,case when USER_DATA='地址' then value end 地址,case when USER_DATA='电话' then value end 电话,case when USER_DATA='证件号' then value end 证件号,case when USER_DATA='QQ' then value end QQ,case when USER_DATA='邮编' then value end 邮编  
FROM userinfo

但是 要如何把重复的  USER_ID 列 合并到一起去呢?
8 楼 zhoutao_0116 2011-04-08  
SELECT NAME AS 姓名,case when USER_DATA='地址' then value end 地址,case when USER_DATA='电话' then value end 电话,case when USER_DATA='证件号' then value end 证件号,case when USER_DATA='QQ' then value end QQ,case when USER_DATA='邮编' then value end 邮编  
FROM userinfo
7 楼 Aaron_Zhang 2011-04-08  
oracle 的 wm_concat 表示没鸭梨
6 楼 xsxjb 2011-04-08  
扩展了视野~  谢谢LZ 分享。
5 楼 galfordliu 2011-04-08  
pivot SQL SERVER2005才新增的。
这题邹建写的一本SQL2000的书上有解决方案,很强大。
4 楼 wangzy24 2011-04-07  
用decode函数可以,或者用case语句
3 楼 jiangnan2112 2011-04-04  
面试什么职位考这种题
pivot好像是oracle11才有的函数,估计大家用11的不多吧,不知道也正常
2 楼 sayes 2011-03-31  
我认为是在考你会不会使用 pivot

相关推荐

Global site tag (gtag.js) - Google Analytics