精华内容
下载资源
问答
  • oracle交叉表sql

    2009-12-19 22:41:55
    交叉表 sql http://whitewolf.0fees.net
  • Oracle动态交叉表生成

    2020-09-11 14:49:41
    Oracle动态交叉表生成
  • 中有以下一些记录: id amount city date 1 12 001 08-11-16 2 14 001 08-11-17 3 25 002 08-11-16 4 23 002 08-11-17 记录按如下方式展示的sql语句???? city 08-11-16 08-11-17 001 12 14 ...

    oracle 动态交叉查询 行列互换 oracle动态交叉表

     

    使用视图 动态创建视图

    SQL code
       
    CREATE OR REPLACE procedure DWDEV.dw_dis_proc(tabname in varchar2,--需要进行行转列操作的表名
    group_col in varchar2,--查询结果要按某列或某些列分组的字段名
       
     column_col in varchar2,--要从行转成列的字段
     value_col in varchar2,--需要聚合的值字段
    Aggregate_func in varchar2 default 'max',--选用的聚合函数,可选,默认为max
     condition in varchar2 default '1=1',--条件语句,可选
     colorder in varchar2 default null,--行转列后列的排序,可选
     roworder in varchar2 default null,--行转列后记录的排序,可选
    when_value_null in varchar2 default null,--若value_col字段的值聚合后为空,则转换成该值,可选
    viewname in varchar2 default 'v_tmp'--创建的视图名称,可选,默认为v_tmp
    )
    Authid Current_User
    as
    c1 sys_refcursor;
    v1 varchar2(1000);
    sqlstr varchar2(10000);
    countTemp number(10);
    begin
    EXECUTE IMMEDIATE 'select count(distinct '||column_col||') from '||tabname into countTemp;
    sqlstr :='create or replace view '||viewname||' as select '||group_col||','
    ||Aggregate_func||'('||value_col||') as "summation",round('|| Aggregate_func||'('||value_col||')/'||countTemp||',2) as "average"';
    open c1 for 'select distinct '||column_col||' from '||tabname||' where '||condition|| case when colorder is not null then ' order by '||colorder end;
    loop
    fetch c1 into v1;
    exit when c1%notfound;
    sqlstr:=sqlstr||chr(10)||','||case when when_value_null is not null then 'nvl(' end||
    Aggregate_func||'(decode(to_char('||column_col||'),'''||v1||''','||value_col||'))'||
    case when when_value_null is not null then chr(44) ||when_value_null||chr(41) end||'"'||v1||'"';
    end loop;
    close c1;
    sqlstr:=sqlstr||' from '||tabname||' where '||condition||' group by '||group_col||case when roworder is not null then ' order by '||roworder end;
    execute immediate sqlstr;
    end dw_dis_proc;
    select * from v_tmp

    展开全文
  • oracle 交叉表

    千次阅读 2007-04-04 20:57:00
    oracle的test中插入记录INSERT INTO test values (N张三,N语文,60)INSERT INTO test values (N李四,N数学,70)INSERT INTO test values (N王五,N英语,80)INSERT INTO test values (N王五,N数学,...
    在oracle的test表中插入记录
    
    INSERT INTO test values (N'张三',N'语文',60)

    INSERT INTO test values (N'李四',N'数学',70)

    INSERT INTO test values (N'王五',N'英语',80)

    INSERT INTO test values (N'王五',N'数学',75)

    INSERT INTO test values (N'王五',N'语文',57)

    INSERT INTO test values (N'李四',N'语文',80)

    INSERT INTO test values (N'张三',N'英语',100)
    交叉表语句的实现:

    --用于:交叉表的列数是确定的

    select name,sum(case subject when '数学' then source else 0 end) as '数学',

     sum(case subject when '英语' then source else 0 end) as '英语',

     sum(case subject when '语文' then source else 0 end) as '语文' 

    from test 

    group by name
    用oracle存储过程实现
    CREATE OR REPLACE PACKAGE BODY "TEST1" as

     procedure sp_test(p_cursor out t_cursor)
     
     is
     sqlstr varchar2(32767);
     begin
     sqlstr:='select name,';
     --构造字符串
     for v_cur in (select distinct subject from test)
     loop
     sqlstr:=sqlstr||'sum(case subject when '''|| v_cur.subject ||''' then score else 0 end ) as '|| v_cur.subject ||',';
     end loop;
     
     
     
     sqlstr := substr(sqlstr,0,length(sqlstr)-1) ||' from test group by name';

     open p_cursor for sqlstr;
     
     end;
     end;
     
    展开全文
  • Oracle动态生成查询交叉表

    千次阅读 2010-08-20 09:16:00
    结构: 序号  字段 中文名称 类型 说 明  1 ReportID NUMBER(4) 报告编号  2 RecordNo NUMBER 记录号  3 FieldNo NUMBER(2) 字段编号  4 Datum VarChar...

    表结构:

    序号
     字段  中文名称        类型           说        明
       1   ReportID   NUMBER(4)     报告编号
       2   RecordNo  NUMBER         记录号
       3   FieldNo     NUMBER(2)     字段编号
       4   Datum      VarChar(200)  值
     

    REPORTID RECORDNO FIELDNO DATUM
          1                1              1         王小强
          1                1              2         武汉市江汉区王家路
          1                1              3         2010-01-12
          1                1              4         65783213
          1                1              5         否
          1                2              1         刘章节
          1                2              2         武昌区中南路
          1                2              3         1950-04-12
          1                2              4         13995094532
          1                2              5         已婚
     

    Oracle动态生成查询交叉表

    select max(a1) as 姓名, max(a2) as 地址, max(a3) as 出生, max(a4) as 电话, max(a5) as 婚否

      from (select recordno,

                   nvl(decode(fieldno, 1, Datum), '') a1,

                   nvl(decode(fieldno, 2, Datum), '') a2,

                   nvl(decode(fieldno, 3, Datum), '') a3,

                   nvl(decode(fieldno, 4, Datum), '') a4,

                   nvl(decode(fieldno, 5, Datum), '') a5

              from Rep_Register

             where reportid = 1

               and RecordNo = (select RecordNo

                                   from Rep_Register

                                  where FieldNo = 2

                                    and Datum Like '武汉市%'))

     group by recordno

    reportid=1为需要查询的报告号

    再下面为其它查询条件

     

    展开全文
  • oracle表查询

    千次阅读 2017-08-17 21:17:12
    左外连:(left join)以左表为主,右表与其对应右外连:(right join)以右表为主,左表与其对应全外连:(full join)以左右表为主,左右表数据交叉连接:自然连接:oracle表查询 代码--92连表查询 --查询...

    SQL92的语法规则的缺点:
    • 语句过滤条件和表连接的条件都放到了where子句中 。
    • 当条件过多时,联结条件多,过滤条件多时,就容易造成混淆

    表连接的种类

    内连接:(inner join)

    • 返回两个表都对应的数据

    外连接:

    • 左外连:(left join)以左表为主,右表与其对应
    • 右外连:(right join)以右表为主,左表与其对应
    • 全外连:(full join)以左右表为主,左右表数据

    交叉连接:(cross join)

    • 笛卡尔集

    自然连接:(Natural join)

    • 自己找关系

    Using子句

    • 如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名。
    • using子句引用的列在sql任何地方不能使用表名或者别名做前缀

    On子句
    • 自然连接的条件是基于表中所有同名列的等值连接
    • 为了设置任意的连接条件或者指定连接的列,需要使用ON子句
    • 连接条件与其它的查询条件分开书写
    • 使用ON 子句使查询语句更容易理解

    子查询:

    • 一个查询的结果作为另一个查询的条件

    单行子查询单行子查询只返回一行记录
    对单行子查询可使用单行记录比较运算符

    < 、  > 、  = 、 >=、  <= 、 <>、!=

    多行子查询

    • 多行子查询返回多行记录
    • 对多行子查询只能使用多行记录比较运算符
    • ALL 和子查询返回的所有值比较
    • ANY 和子查询返回的任意一个值比较
    • IN 等于列表中的任何一个

    oracle连表查询 代码

    --92连表查询
    
    
    
    
    --查询员工信息和部门信息
    select * from emp e, dept d where e.deptno = d.deptno;
    --查询员工姓名,部门名称
    select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;
    --查询员工所有信息和部门名称
    select e.*, d.dname from emp e, dept d where e.deptno = d.deptno
    --查询工资大于3000的员工姓名,工资和部门名称
    select e.ename, e.sal, d.dname
      from emp e, dept d
     where e.deptno = d.deptno
       and e.sal > 3000;
    --非等值查询
    --查询员工的工资等级
    select *
      from emp e, salgrade s
     where e.sal <= s.hisal
       and e.sal > s.losal
    --外连接
    --左外连
    select * from emp e, dept d where e.deptno = d.deptno(+)
    --右外连
    select * from emp e, dept d where e.deptno(+) = d.deptno
    --自连接 自己连自己
    --查询员工姓名和员工的经理姓名
    select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno;
    --查询员工姓名和员工的经理姓名和其经理的姓名
    select e1.ename, e2.ename, e3.ename
      from emp e1, emp e2, emp e3
     where e1.mgr = e2.empno
       and e2.mgr = e3.empno;
    
    
    
    
    --99连表查询
    
    
    
    
    --cross join交叉连接(笛卡尔集)
    select * from emp e cross join dept d;
    -- natural join 自然连接
    select * from emp natural join dept;
    --using
    select e.ename, deptno from emp e join dept d using (deptno);
    --on 自定义连接条件 join 后紧跟 on
    select * from emp e join dept d on e.deptno = d.deptno;
    select * from emp e1 join emp e2 on e1.mgr = e2.empno;
    --查询员工的姓名和经历的姓名和其经理的姓名
    select e1.ename, e2.ename, e2.ename
      from emp e1
      join emp e2
        on e1.mgr = e2.empno
      join emp e3
        on e2.mgr = e3.empno
    --inner join 两边都合法的数据(相对比较精准)内连接
    select * from emp e inner join dept d on e.deptno = d.deptno;
    --left join 以左表为主
    select * from emp e left join dept d on e.deptno = d.deptno;
    --right join 以右表为主
    select * from emp e right join dept d on e.deptno = d.deptno;
    --full join 全连 取两个表的所有数据
    select * from emp e full join dept d on e.deptno = d.deptno;
    --查询员工姓名和部门姓名和其经理的名称和经理的部门名称
    select e1.ename, e2.ename, d1.dname, d2.dname
      from emp e1
      left join dept d1
        on e1.deptno = d1.deptno
      left join emp e2
        on e1.mgr = e2.empno
      left join dept d2
        on e2.deptno = d2.deptno;
    select sal from emp where ename='CLARK';
    select *from emp where sal >2450;
    --子查询
    --查询工资大于CLARK工资的员工信息
    select * from emp where sal > (select SAL from emp where ename = 'CLARK');
    --思考:查询工资高于平均工资的雇员名字和工资。
    select ename, sal from emp where sal > (select avg(sal) from emp);
    --思考:查询和SCOTT同一个部门且比他工资低的雇员名称和工资
    select ename, sal
      from emp
     where deptno = (select deptno from emp where ename = 'SCOTT')
       and sal < (select sal from emp where ename = 'SCOTT');
    --多行子查询查询和'SCOTT','SMITH','CLARK'在同一个部门的员工信息并不包含'SCOTT','SMITH','CLARK';
    select *
      from emp
     where deptno in
           (select deptno from emp where ename in ('SCOTT', 'SMITH', 'CLARK'))
       and ename not in ('SCOTT', 'SMITH', 'CLARK');
    --思考:查询工资最高的雇员名字和工资。
    select ename, sal from emp where sal = (select max(sal) from emp);
    -- 查询职务和SCOTT相同,比SCOTT 雇佣时间早的员工信息
    select *
      from emp
     where job = (select job from emp where ename = 'SCOTT')
       and hiredate < (select hiredate from emp where ename = 'SCOTT')
    --查询工资比SCOTT 高或者雇用时间比SCOTT 早的雇员的编号和姓名
    select empno,ename from emp where SAL>(select sal from emp where ename ='SCOTT')OR HIREDATE<
    (SELECT HIREDATE FROM EMP WHERE ENAME ='SCOTT');
    --多行查询
    --查询工资低于任何一个"CLERK"的工资的雇员信息
    SELECT *
      FROM EMP
     WHERE SAL < ANY (SELECT sal from emp where JOB = 'CLERK');
    --查询工资比所有的“SALESMAN”都高的雇员的编号、名称和工资
    select empno, ename, sal
      from emp
     where sal > all (select sal from emp where job = 'SALESMAN');
    --查询部门20中职务同部门10的雇员一样的雇员信息
    select * from emp where job in(select job from emp where deptno=10)and deptno=20; 
    --查询在雇员中有哪些人是经理人
    select * from emp where empno in (select  distinct mgr from emp where mgr is not null or mgr!='');
    --找出部门编号为20的所有员工中收入最高的职员
    select * from emp where sal=(select max(sal) from emp where deptno='20');
    --查询每个部门平均薪水的等级 
    select a.deptno, grade
      from salgrade, (select deptno, avg(sal) b from emp group by deptno) a
     where losal < a.b
       and hisal >= a.b


    展开全文
  • Oracle表查询

    2016-04-25 15:37:58
    表查询数据可以是两个表或者视图,也可以是两个以上的表或者视图; 1.从多表查询数据也被称为多表连接 2、连接查询的目的是为用户提供更详细的数据 3、有各种各样的连接方式; ---- 如:select e.employee_id,e....
  • oracle表查询

    千次阅读 2015-06-22 18:19:27
    表查询基本语法 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合。 -- 笛卡尔积 select * from ...
  • ORACLE表查询优化

    2014-04-26 23:42:24
    假设高速缓冲里已经存储了执行过的sql语句,那就直接匹配执行了,少了步骤,自然就快了,但是经过测试会发现高速缓冲只对简单的起作用,多的情况完全没有效果,例如在查询的时候那叫一个快,但是假设连接多...
  • Oracle表查询

    千次阅读 2019-04-25 20:25:34
    表查询2. 连接类型2.1 Natural joins(自然连接)2.2 Outer joins(外连接)2.3 Cross join(交叉连接)3. 语法3.1 使用USING子句3.2 使用ON子句3.3 表的自连接3.4 非等值连接3.5 INNER & OUTER JOIN 内连接和...
  • oracle动态交叉表

    2011-05-03 15:57:04
    有一张 ID NAME QUARTER QUANTITY 1 开发部 春天 10000 2 开发部 夏天 50000 3 开发部 秋天 30000 4 开发部 冬天 20000 5 销售部 春天 10000 6 销售部 夏天 4000 7 销售部 秋天 30000 8 销售部 冬天 ...
  • Oracle表查询 –工作中避免笛卡儿积的出现
  • 假设高速缓冲里已经存储了执行过的sql语句,那就直接匹配执行了,少了步骤,自然就快了,但是经过 测试会发现高速缓冲只对简单的起作用,多的情况小完全没有效果啊,例如在查询的时候那叫一个...
  • oracle表查询优化

    2014-01-15 16:14:34
    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单数据的统计比多统计的速度完全是两个概念.单统计可能只要0.02秒,但是2张表联合统计就可能要几十了.这是因为ORACLE只对
  • 初学oracle表查询

    千次阅读 2017-08-17 19:44:02
    -- 92连表查询 -- 查询员工信息和部门信息 select * from emp e,dept d where e.deptno = d.deptno -- 查询员工姓名,部门名称 select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno -- 查询员工...
  • BOD-Oracle表查询

    2013-11-23 14:46:28
    表查询会产生笛卡儿积,为了消除笛卡儿积必须寻找相同字段 (Oracle编辑sql文件: ed 编辑 @执行) 进行多表查询有下列几个步骤: 1.确定有几张表 2.消除笛卡儿积 3.确定有哪些字段  左连接查询...
  • oracle表查询介绍

    2012-03-21 20:32:20
    一、多表查询 1、 (1)多个表之间关系:一对多|(多对一) 多对多 一对一 3种 (2)关系的完整性约束:实体完整性、参照完整性、用于定义的完整性。 必须满足实(3)体完整性和参照完整性. (4)实体完整性:...
  • Oracle表查询,四种连接方式

    万次阅读 多人点赞 2018-03-22 09:26:24
    二、多表查询:  表连接分类: 内连接、外连接、交叉连接、自连接   1、内连接: [inner] join on  SQL语法格式:  语法1:  select *  from 表1 [inner] join 表2 on 表1.字段1=表2.字段1;  语法2:...
  • - - 查询table1中的所有信息 条件查询(多列,多条件查询) 从学生中检索出2班性别为女性的学生的姓名和电话 Select Sname,Stel from t_student Where Sclass = 2 and Ssex =‘f’; 选择无重复行 distinct...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,175
精华内容 8,070
关键字:

oracle交叉表查询