sql与oracle中有关case和decode的用法(行转列)及比较
来源:互联网 发布:transmission mac 编辑:程序博客网 时间:2024/06/01 10:27
转自:http://www.cnblogs.com/NothingIsImpossible/archive/2010/10/13/1850250.html
0 0
- sql与oracle中有关case和decode的用法(行转列)及比较
- sql与oracle中有关case和decode的用法(行转列)及比较
- sql与oracle中有关case和decode的用法(行转列)及比较
- sql与oracle中有关case和decode的用法(行转列)及比较
- sql与oracle中有关case和decode的用法(行转列)及比较
- oracle中case和decode的用法
- oracle函数之case和decode的用法区别及性能比较
- oracle函数之case和decode的用法区别及性能比较
- oracle中DECODE与CASE的用法区别
- 【SQL基础】case when和decode的用法与区别
- oracle中decode和case的用法介绍
- Oracle中case when和decode的用法
- Mysql中ifNull()/if()/case when用法和Oracle中nvl()/nvl2()/decode()的用法及其比较
- oracle decode 与case 的用法
- oracle中case when then及decode用法
- SQL查询中DECODE函数和CASE WHEN 比较
- ORACLE 中 DECODE 与 CASE WHEN THEN 用法
- Oracle-Decode()函数和CASE语句的比较
- untiy没法自动打开xcode,报错UnityException: Launching iOS project via Xcode failed
- thinkphp的select和find的区别
- 用Java实现冒泡排序
- linux 线程同步、互斥
- mysql 数据表中主键(primary key)的操作
- sql与oracle中有关case和decode的用法(行转列)及比较
- [JQ权威指南]第十一天:使用trigger方法触发指定类型事件
- swift学习笔记之数据类型
- Android_UI不同dpi下的图片选择
- spoj687 REPEATS
- This inspection controls whether the Persistence QL Queries are error-checked
- iOS8后台定位
- JS 获取浏览器窗口大小
- 老了,健忘了....
sql与oracle中有关case和decode的用法(行转列)及比较
引:
为了举例说明,这里创建了一张成绩表,如下图所示:
比较:
1、sql中,这两个函数我们仅能使用case,代码及结果如下:
select name,
case Subject
when '语文' then 1
when '数学' then 2
when '英语' then 3 --else 3
end as '科目代码'
from Results
同样的,我们可以用case实现行转列,代码及结果如下:
select Name,
sum(case when Subject='语文' then Result end) '语文',
sum(case when Subject='数学' then Result end) '数学',
sum(case when Subject='英语' then Result end) '英语'
from Results
group by Name
2、但是,在oracle中,这两个函数我们都可以使用,代码及结果如下:
decode用法:select Name,decode(Subject,'语文',1,'数学',2,'英语',3) 科目代码 from results;
select Name,decode(Subject,'语文',1,'数学',2,3) 科目代码 from Results;
case用法:
select name,
case
when Subject='语文' then 1
when Subject='数学' then 2
when Subject='英语' then 3 --else 3
end as 科目代码
from Results;
这两种方法均能达到同样的结果:
同样的,我们可以使用这两个函数实现行转列,代码及结果如下:
decode:
select
Name,
sum(decode(Subject,'语文',Result,0)) 语文,
sum(decode(Subject,'数学',Result,0)) 数学,
sum(decode(Subject,'英语',Result,0)) 英语
from Results
group by Name;
case:
select
Name,
sum((case when Subject='语文' then Result else 0 end)) 语文,
sum((case when Subject='数学' then Result else 0 end)) 数学,
sum((case when Subject='英语' then Result else 0 end)) 英语
from Results
group by Name;
数据库表与行转列的中间结果(想想还是也附上)
oracle中:
select
Name,
decode(Subject,'语文',Result,0) 语文,
decode(Subject,'数学',Result,0) 数学,
decode(Subject,'英语',Result,0) 英语
from Results;
或
select
Name,
(case when Subject='语文' then Result else 0 end) 语文,
(case when Subject='数学' then Result else 0 end) 数学,
(case when Subject='英语' then Result else 0 end) 英语
from Results;
结果如下:
以上内容,不对的地方请指正。此文仅想抛砖引玉...
(续)
SQL2000中动态SQL
declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , sum(case Subject when '+ char(39) + Subject + char(39) +' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from results) as a
set @sql = @sql + ' from results group by name'
exec(@sql)
SQL2005中动态SQL
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + Subject from Results group by Subject
set @sql = '[' + @sql + ']'
exec ('select * from Results pivot (max(result) for subject in (' + @sql + ')) b')
select name,[语文] as 语文,[数学] as 数学,[英语] as 英语 from Results
pivot
(
sum(result) for subject in ([语文],[数学],[英语])
) as pvt
与
select name,subject,result from
(
select name,[语文] as 语文,[数学] as 数学,[英语] as 英语 from Results
pivot
(
sum(result) for subject in ([语文],[数学],[英语])
) as pvt
) mytable
unpivot
( result for subject in ([语文],[数学],[英语])) abc