大家好,
基础数据为姓名  兴趣
a   , 看书
b   , 篮球
a   , 旅行
a   , 足球
b   , 看书
想要实现的视图的效果为:姓名 兴趣1 兴趣2 兴趣3 兴趣4 兴趣5
a    看书  旅行  足球  无    无
b    篮球  看书  无    无    无主要的问题在于不能把列定死了,如第一列就都放看书,第二列都放旅行之类的
要实现有值就往前面的列里面插入的效果。大家对这个有什么好的想法吗,谢谢指点哈! 

解决方案 »

  1.   

    行转列问题,当列的基数较高时建议使用存储过程动态创建视图。参考:
    http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?93286
      

  2.   

    读取多少个兴趣,然后拼接decode性趣,组合,动态执行。
      

  3.   

    如果兴趣列数确定,可以如下
    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.姓名