日期:2014-05-17  浏览次数:20743 次

动态行列转换,求指点
大家好,
基础数据为

姓名 兴趣
a , 看书
b , 篮球
a , 旅行
a , 足球
b , 看书


想要实现的视图的效果为:

姓名 兴趣1 兴趣2 兴趣3 兴趣4 兴趣5
a 看书 旅行 足球 无 无
b 篮球 看书 无 无 无

主要的问题在于不能把列定死了,如第一列就都放看书,第二列都放旅行之类的。。。
要实现有值就往前面的列里面插入的效果。大家对这个有什么好的想法吗,谢谢指点哈!

 

------解决方案--------------------
如果兴趣列数确定,可以如下
SQL code
WITH TB AS
 (SELECT 'a' AS 姓名, '看书' AS 兴趣
    FROM DUAL
  UNION ALL
  SELECT 'b' AS 姓名, '篮球' AS 兴趣
    FROM DUAL
  UNION ALL
  SELECT 'a' AS 姓名, '旅行' AS 兴趣
    FROM DUAL
  UNION ALL
  SELECT 'a' AS 姓名, '足球' AS 兴趣
    FROM DUAL
  UNION ALL
  SELECT 'b' AS 姓名, '看书' AS 兴趣 FROM DUAL)
SELECT 姓名,
       NVL(MAX(DECODE(CNT, 1, 兴趣)), '无') 兴趣1,
       NVL(MAX(DECODE(CNT, 2, 兴趣)), '无') 兴趣2,
       NVL(MAX(DECODE(CNT, 3, 兴趣)), '无') 兴趣3,
       NVL(MAX(DECODE(CNT, 4, 兴趣)), '无') 兴趣4,
       NVL(MAX(DECODE(CNT, 5, 兴趣)), '无') 兴趣5
  FROM (SELECT 姓名,
               兴趣,
               ROW_NUMBER() OVER(PARTITION BY 姓名 ORDER BY 兴趣) CNT
          FROM TB) T
 GROUP BY T.姓名