Oracle行转列SQL

-- Create table
/*create table TEST_TABLE
(
  STUDENT VARCHAR2(200),
  SUBJECT VARCHAR2(200),
  GRADE   NUMBER
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
*/
/*insert into test_table(student , Subject , grade) values(‘张三‘ , ‘语文‘ , 80)
insert into test_table(student , Subject , grade) values(‘张三‘ , ‘数学‘ , 70)
insert into test_table(student , Subject , grade) values(‘张三‘ , ‘英语‘ , 60)
insert into test_table(student , Subject , grade) values(‘李四‘ , ‘语文‘ , 100)
insert into test_table(student , Subject , grade) values(‘李四‘ , ‘数学‘ , 80)
insert into test_table(student , Subject , grade) values(‘李四‘ , ‘英语‘ , 90)
go
*/
--oracle中Decode()函数使用 然后将这些累计求和(sum部分)
select t.student AS 姓名,sum(decode(t.subject,‘语文‘,grade,null))语文
,sum(decode(t.subject,‘数学‘,grade,null)) 数学
,sum(decode(t.subject,‘英语‘,grade,null)) 英语
from test_table t group by student 

--静态SQL,指subject只有语文、数学、英语这三门课程。
select student 姓名,
  max(case subject when ‘语文‘ then grade else 0 end) 语文,
  max(case subject when ‘数学‘ then grade else 0 end) 数学,
  max(case subject when ‘英语‘ then grade else 0 end) 英语
from test_table group by student
/*
姓名         语文        数学        英语
---------- ----------- ----------- -----------
李四         100          80          90
张三         80           70          60
*/
--动态SQL,指subject不止语文、数学、英语这三门课程。 sql server  下测试
declare @sql varchar(8000)
set @sql = ‘select student as ‘ + ‘姓名‘
select @sql = @sql + ‘ , max(case Subject when ‘‘‘ + Subject + ‘‘‘ then grade else 0 end) [‘ + Subject + ‘]‘
from (select distinct Subject from test_table) as a
set @sql = @sql + ‘ from test_table group by student‘
exec(@sql)

having子句可以过滤组函数结果或是分组的信息,且写在group by子句后 模糊查询 以及排序
select username,userno,userpassword from userinfo t where  username like ‘%a%‘
 group  by username,userno,userpassword  having(userno)>40 order by username desc

数量关系:   多对一关系 一对多关系   一对一关系  多对多关系
第一范式,所有的属性都必须是单值,也就是属性只表示单一的意义。(记录可以重复,没有任何限制)
第二范式,属性要求唯一且非空,(记录不可重复,但是数据可能会出现冗余)。
第三范式,非主属性只能依赖于主属性,不能依赖于其他非主属性。(解决数据冗余问题)

一个表中只能存储一个LONG类型 CLOB 存储大的文本对象   BLOB 存储大的二进制对象
Oralce支持级联删除,不支持级联更新

时间: 2024-10-08 11:13:49

Oracle行转列SQL的相关文章

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函数: 这个

IT忍者神龟之 oracle行转列、列转行

一.行转列 须要将例如以下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum).结合group by分组实现的 [sql] view plaincopy create table test( id varchar2(255) primary key not null, name varchar2(255), course varchar2(255), score varchar2(255) ); insert into test values(sys_guid

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行转列、列转行

一.行转列 需要将如下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum),结合group by分组实现的 [sql] view plaincopy create table test( id varchar2(255) primary key not null, name varchar2(255), course varchar2(255), score varchar2(255) ); insert into test values(sys_guid()

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 行转列、列转行 的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行转列、列转行的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(列名)

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行转列操作

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