`
jadewoo
  • 浏览: 86333 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

oracle行转列

 
阅读更多
具体Sql语句怎么写  
  比如这个例子,但是科目不固定,是动态的  
  Create   table   test   (name   char(10),km   char(10),cj   Number)  
   
  insert   into   test   values('张三','语文',80)  
  insert   into   test   values('张三','数学',86)  
  insert   into   test   values('张三','英语',75)  
  insert   into   test   values('李四','语文',78)  
  insert   into   test   values('李四','数学',85)  
  insert   into   test   values('李四','英语',78)  
   
  commit;  
  怎样实现成这样:  
  name     语文     数学     英语  
  李四     78         85         83  
  张三     80         86         75  
   
  Top
3 楼chenyiwei(无心快语)回复于 2004-11-04 11:31:56 得分 0
select name,sum(case when km='语文' then cj else 0 end) 语文,sum(case when km='英语' then cj else 0 end) 英语,sum(case when km='数学' then cj else 0 end) 数学 from test group by name一个比较笨的办法:  
  select    
  name,  
  sum(decode(km,'语文',cj,0)   语文,  
  sum(decode(km,'数学',cj,0)   数学,  
  sum(decode(km,'英语',cj,0)   英语  
  from   test   group   by   nameTop
4 楼rwpublic(rwpublic)回复于 2004-11-04 11:44:01 得分 0
如何实现行列转换  
  [A]1、固定列数的行列转换  
  如  
  student   subject   grade  
  ---------------------------  
  student1   语文   80  
  student1   数学   70  
  student1   英语   60  
  student2   语文   90  
  student2   数学   80  
  student2   英语   100  
  ……  
  转换为    
  语文   数学   英语  
  student1   80   70   60  
  student2   90   80   100  
  ……  
  语句如下:  
  select   student,sum(decode(subject,'语文',   grade,null))   "语文",  
  sum(decode(subject,'数学',   grade,null))   "数学",  
  sum(decode(subject,'英语',   grade,null))   "英语"  
  from   table  
  group   by   student  
   
  2、不定列行列转换  
  如  
  c1   c2  
  --------------  
  1   我  
  1   是  
  1   谁  
  2   知  
  2   道  
  3   不  
  ……  
  转换为  
  1   我是谁  
  2   知道  
  3   不  
  这一类型的转换必须借助于PL/SQL来完成,这里给一个例子  
  CREATE   OR   REPLACE   FUNCTION   get_c2(tmp_c1   NUMBER)    
  RETURN   VARCHAR2    
  IS    
  Col_c2   VARCHAR2(4000);    
  BEGIN  
  FOR   cur   IN   (SELECT   c2   FROM   t   WHERE   c1=tmp_c1)   LOOP    
  Col_c2   :=   Col_c2||cur.c2;    
  END   LOOP;    
  Col_c2   :=   rtrim(Col_c2,1);  
  RETURN   Col_c2;    
  END;  
  /  
  SQL>   select   distinct   c1   ,get_c2(c1)   cc2   from   table;即可  
   
  Top
5 楼wzs_wzs123(蓝天百云)回复于 2004-11-04 12:09:06 得分 0
rwpublic(rwpublic)   第二种没有实现由行到列的转换Top
6 楼yjdn(文刀无尽)回复于 2004-11-04 12:17:40 得分 0
--测试  
  declare   col1   test.km%type;                 --定义类型  
          sqlstr   varchar2(8000);  
          cursor   c_try   is   select   distinct   km   from   test;  
          begin  
          sqlstr:='';  
          open   c_try;  
          loop  
          fetch   c_try   into   col1;  
          exit   when   c_try%notfound;  
          sqlstr:=sqlstr||',sum(decode(km,'''||col1||''',cj,0))   as   '||col1;  
          exit   when   c_try%notfound;  
          end   loop;  
          close   c_try;  
          sqlstr:='create   table   tt   as   select   name'||sqlstr||'   from   test   group   by   name';  
        --tt为刚创建的一个保存结果的表  
        execute   immediate   sqlstr;  
          end;  
   
  --执行  
  select   *   from   tt;  
  结果:  
  NAME                           数学               英语               语文  
  ----------   ----------   ----------   ----------  
  李四                               85                   78                   78  
  张三                               86                   75                   80  
   
   
  --楼主给出的数据有错,李四的英语成绩应该是78Top
7 楼yjdn(文刀无尽)回复于 2004-11-04 12:18:39 得分 0
执行完删除表tt  
  drop   table   tt;  
  /Top
8 楼wzs_wzs123(蓝天百云)回复于 2004-11-04 12:36:02 得分 0
yjdn(无尽天空)   ,兄弟,给我一个能够直接运行的SQl语句,我对ORacle不太熟Top
9 楼yjdn(文刀无尽)回复于 2004-11-04 12:46:59 得分 50
MSSQL语句?  
  declare   @sql   varchar(8000)  
  set   @sql=''  
  select   @sql=@sql+',sum(case   km   when   '''+rtrim(km)+'''   then   cj   else   0   end)   as   ['+rtrim(km)+']'    
  from   test    
  group   by   km  
  exec('select   name'+@sql+'   from   test   group   by   name')  
   
   
  --那你的建表语句还得改一下,把number改成int



http://community.csdn.net/Expert/topic/3222/3222974.xml?temp=.5841181  
   
  col1             col2  
  -----------------  
  0001             Tom  
  0001             Jack  
  0001             Mike  
  0002             Kate  
  0002             Rose  
  0002             Fene  
   
  如何用一条SQL语句得到如下结果:  
  col1           col2  
  -----------------  
  0001           Tom,Jack,Mike  
  0002           Kate,Rose,Fene  
   
   
   
  创建自定义函数:  
  create     or     replace     function     f_ename(jobno     in     varchar2)      
  return     varchar2     is      
         
  str_return     varchar2(200);      
  cursor     c_ename(v_jobno     varchar2)     is     select     ename     from     emp     where     job=v_jobno;      
  begin      
  for     str_temp     in     c_ename(jobno)     loop      
  str_return:=str_return||str_temp.ename;      
  end     loop;      
  return     str_return;      
  end;      
  /      
   
  调用:  
  select   job,f_ename(job)   from   (select   distinct   job   from   emp);

分享到:
评论

相关推荐

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。...通过实际的使用示例和语法说明,本文旨在为读者提供一个全面的Oracle行转列之PIVOT功能的指南。

    oracle 行转列

    ### Oracle 行转列知识点详解 #### 一、Oracle 行转列概念及应用场景 在数据库操作中,经常需要对数据进行格式上的调整以便更好地分析或展示数据。其中,“行转列”是一种常见的数据处理方式,它指的是将原本存储...

    oracle行转列较精典的解决方案

    ### Oracle行转列的经典解决方案 在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常...

    Oracle行转列

    Oracle行转列 Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列...

    Oracle行转列(不定列)

    总的来说,Oracle数据库提供了`PIVOT`功能来实现行转列,对于确定的列数,`PIVOT`是高效且直接的解决方案。而在面对不定列时,动态SQL和自定义函数成为更合适的选择。在实际应用中,我们需要根据具体需求和数据特性...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    ### Oracle行转列聚合函数WMSYS.WM_CONCAT详解 #### 一、概述 在进行数据处理时,经常会遇到需要将多行数据合并为单行的情况,这通常被称为“行转列”。Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_...

    oracle动态行转列

    本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...

    oracle行转列,列转行的例子

    oracle行转列,列转行的例子

    ORACLE行转列

    许多情况下,由于程序中需要将行转为列展示,如果使用ORACLE那么这个资源适合你。

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    Sql,oracle数据表行转列问题

    SQL行转列问题解决方案 SQL行转列问题是指将行记录转换为列记录的操作。本文将详细讲解SQL行转列问题的解决方案,并提供了一个具体的实例来帮助读者更好地理解该问题。 问题描述 假设我们有一个学生成绩表tb,...

    Oracle行转列题目:面试题目.sql

    面试题目.sql

    Oracle实现行转换成列的方法

    在Oracle数据库中,这种行转列的操作可以通过多种方法实现,包括使用`PIVOT`操作、`DECODE`函数以及自定义的聚合函数等。下面我们将详细讨论这些方法,并结合提供的实例进行解析。 首先,我们来看一个简单的例子,...

Global site tag (gtag.js) - Google Analytics