Oracle 行转列

一、简易运用

——>没转之前一个主号绑定多个副号的多行输出(像移动的欢乐在线)

SELECT   f.town_name 镇区,
          f.school_name 学校,
          f.class_name 班级,
          f.student_name 学生,
          b.phone 主号码,
          b.bindphone 绑定的副号码
   FROM   dg_FPS_BINDPHONE b, dg_family f

WHERE       b.family_id = f.family_id
          AND b.phone = f.phone
          AND f.school_id = 61758
          AND NVL (f.is_test, 0) <> 1;

——>转之后的一行多列输出

(使用分析函数的情况)
   SELECT   town_name,
            school_name,
            class_name,
            student_name,
            phone,
            MAX (DECODE (rn, 1, bindphone)) "亲情号码1",
            MAX (DECODE (rn, 2, bindphone)) "亲情号码2",
            MAX (DECODE (rn, 3, bindphone)) "亲情号码3",
            MAX (DECODE (rn, 4, bindphone)) "亲情号码4",
            MAX (DECODE (rn, 5, bindphone)) "亲情号码5",
            MAX (DECODE (rn, 6, bindphone)) "亲情号码6"
     FROM   (SELECT   f.town_name,
                      f.school_name,
                      f.class_name,
                      f.student_name,
                      b.phone,
                      b.bindphone,
                      COUNT( * )
                         OVER ( PARTITION BY f.town_name,f.school_name,f.class_name,f.student_name,b.phone
                            ORDER BY ROWNUM
                            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                         )
                         rn
               FROM   dg_fps_bindphone b, dg_family f
              WHERE       b.family_id = f.family_id  AND  b.phone = f.phone  AND  f.school_id = 61758  AND  NVL (f.is_test, 0) <> 1)

GROUP BY   town_name,school_name,class_name,student_name,phone;

(不使用分析函数的情况)

select t.user_id,t.name,

max(decode(t.yw_name,‘流量包‘,‘是‘,‘否‘)) 是否开通流量包,

max(decode(t.yw_name,‘流量包‘,dt,NULL)) 是否开通流量包,

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%50元%‘ then ‘50元加餐‘ end) 是否50元加餐,

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%50元%‘ then dt end) 五十元加餐时间,

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%100元%‘ then ‘100元加餐‘ end) 是否100元加餐,

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%100元%‘ then dt end) "100元加餐时间",

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%200元%‘ then ‘200元加餐‘ end) 是否200元加餐,

max(case when t.yw_name=‘加餐包‘ and t.attr_value like ‘%200元%‘ then dt end) "200元加餐时间",

max(case when t.yw_name=‘加餐包‘ and t.attr_value is null then ‘未知加餐包‘ end) 是否未知加餐包,

max(case when t.yw_name=‘加餐包‘ and t.attr_value is null then dt end) "未知加餐包时间"

from temp_liut l, liut_temp5 t

where l.acc_nbr=t.user_id

group by t.user_id,t.name;

二、用 wmsys.wm_concat 系统内部函数
     通过运用wmsys系统用户下的wm_concat函数也能达到行列转换效果(一列显示,数据之间以逗号分隔)

--  一个老师会带多个班级
   SELECT   town.name 镇区,
            s.school_name,
            t.username 教师,
            t.userid 账号,
            t.mphone 联系方式,
            r.name 角色,
            wmsys.wm_concat (c.class_name) 班级
     FROM   area a,
            town,
            qx_sch_role r,xj_school s LEFT JOIN xj_teacher t ON s.id = t.school_id
               LEFT JOIN tea_class_subject su ON t.id = su.teacher_id
            LEFT JOIN xj_class c ON su.class_id = c.id
    WHERE       a.id = town.area_id
            AND town.id = s.town_id
            AND r.id = t.role_id
            AND a.id = 1
            AND NVL (town.is_test, 0) <> 1

GROUP BY   town.name,s.school_name,t.username,t.userid,t.mphone,r.name

三、11.2新函数listagg

语法:listagg(分割列,分隔符) within group(order by 排序列)

select listagg(o.rybs, ‘;‘) within group(order by o.rybs)
   from gk_xszrr o
  where rownum <= 100;

时间: 2024-08-23 10:23:49

Oracle 行转列的相关文章

oracle行转列

针对oracle数据查询的数据,行转列 1.wm_concat函数: 例一: select c1,c2,wm_concat(c3) from T where.... group by c1,c2 查询结果自动用","分割 例二: select c1,c2,wm_concat(c3)over(partition by ..order by..) from T where.... 其中,partition用来分组, order用来排序 2.sys_connect_by_path函数: 这个

oracle 行转列 分析函数

oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + 1 || ':' || ELEMENT) ELEMENT FROM T_MERCH_ELEMENT where code_ts='020745' group by CODE_TS; 得到的结果: 上面大家可能会发现序号没有按顺序排列下来.如果没有要求,就这样就可以了.如果要排序看方法二. 方法二:WM_CONC

Oracle行转列、列转行的Sql语句总结(转)

多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str from app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以",&quo

oracle 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

Oracle 行转列、列转行 的Sql语句总结

参考文章:http://blog.csdn.net/tianlesoftware/article/details/4704858 多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union

Oracle行转列操作

有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式: 原表结构展示如下:---------------------------产品名称    销售额     季度---------------------------奶酪          50     第一季度奶酪          60     第二季度啤酒          50     第二季度啤酒          80     第四季度--------------------------- 现在需要将上面的原表结构转换为

Oracle行转列的函数

--行转列的函数-- CREATE OR REPLACE FUNCTION Calvin( col IN VARCHAR2,dw IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); Sel_sql varchar2(2000); ---//SQL语句声明 BEGIN Sel_sql:='select '||col||' from TB5001 where dwdm='''|| dw||''''; execute immediate Sel_s

Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)

偶然需要了解,学习了这篇文章,转载记录一下 自:http://blog.csdn.net/jxzkin/article/details/7949629 1.创建测试数据 [html]?view plaincopy CREATE?TABLE?CC?? ??(Student?NVARCHAR2(2),Course?NVARCHAR2(2),Score?INT?? ??);?? [html]?view plaincopy INSERT?into?CC??? select?N'张三',N'语文',78?

偶遇Oracle行转列

行转列应该是数据库比较常见的操作了,在oracle中可以使用pivot.decode,可以参考呆瓜的blog: http://blog.csdn.net/ch7543658/article/details/41146809 SELECT name, MAX(DECODE(course, 'java', gread)) AS java, MAX(DECODE(course, 'c#', gread)) AS c#, MAX(DECODE(course, 'c', gread)) AS c, MAX

Oracle行转列、列转行的Sql语句总结

多行转字符串 这个比较简单,用||或concat函数可以实现 ?SQL Code? 12 ? select?concat(id,username)?str?from?app_userselect?id||username?str?from?app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 首先让我们来看看这个神奇的函数wm_concat(列名)