`

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')

 

注:引用自  http://www.cnblogs.com/NothingIsImpossible/archive/2010/10/13/1850250.html

分享到:
评论

相关推荐

    Oracle_case_when_用法

    详细讲解了case、when的用法.ASE表达式可以在SQL中实现if-then-else型的逻辑,而不必使用PL/SQL。CASE的工作方式与DECODE()类似,但应该使用CASE,因为它与ANSI兼容。

    Oracle高级sql学习与练习

    6、DECODE函数和行列互换 7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、...

    oracle database 10g 完整参考手册part1

    第16章 DECODE和CASE SQL中的if-then-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 Oracle基本安全 第Ⅲ部分 高级内容 第19章 高级安全性—— 虚拟专用数据库 第20章 使用表空间 第21章 用SQL*Loader...

    ORACLE DECODE函数在中国式报表统计查询中的组合条件实现

    使用DECODE实现统计,是比较常用的。 但是在遇到需要组合条件进行统计时,有时却不如case when 或者另建视图好用。 可是有时就想用DECODE,咋办? 这里给大家介绍一下DECODE如何实现组合条件查询,一句SQL查询一张...

    oracle database 11g 高清完整中文版part2

     第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区 . 第19章 oracle 基本安全 第ⅲ部分 高 级 主 题  第20章 高级安全性——虚拟专用数据库  第21章 ...

    Oracle_Database_11g完全参考手册.part3/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    Oracle_Database_11g完全参考手册.part2/3

    第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...

    oracle database 11g 完整参考手册中文高清完整版part3

     第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区 . 第19章 oracle 基本安全 第ⅲ部分 高 级 主 题  第20章 高级安全性——虚拟专用数据库  第21章 ...

    Oracle_Database_11g完全参考手册.part2

    原书名: Oracle Database 11g The Complete Reference 原出版社: McGraw-Hill Osborne Media ... 第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区

    Oracle_Database_11g完全参考手册.part5

    原书名: Oracle Database 11g The Complete Reference 原出版社: McGraw-Hill Osborne Media ... 第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区

    oracle database 11g完全参考手册 高清完整版part1 共3部分

     第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区 . 第19章 oracle 基本安全 第ⅲ部分 高 级 主 题  第20章 高级安全性——虚拟专用数据库  第21章 ...

    Oracle_Database_11g完全参考手册.part3

    基本信息 原书名: Oracle Database 11g The Complete Reference 原出版社: McGraw-Hill Osborne ... 第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区

    Oracle_Database_11g完全参考手册.part4

    原书名: Oracle Database 11g The Complete Reference 原出版社: McGraw-Hill Osborne Media ... 第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区

    SQL培训第一期

    属性不依赖于其它非主属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关,即要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 1.5.3.2 举例 党员表 党员Id 党员姓名 组织Code 符合3NF ...

    oracle sql of extracting table structure

    then all_c.data_type || decode(all_c.data_precision,0,'',NULL,'','(' || to_char(all_c.data_precision)) || decode(all_c.data_precision,0,'',NULL,'', decode(all_c.data_scale,0,'',NULL,'', ',' || to_...

    racle_Database_11g完全参考手册.part1

    原书名: Oracle Database 11g The Complete Reference 原出版社: McGraw-Hill Osborne Media ... 第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区

    Oracle用decode函数或CASE-WHEN实现自定义排序

    对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序。但排序规则是默认的,数字、时间、字符串等都有自己默认的排序规则。有时候需要按自己的想法来排序,而不是按字段默认排序规则...

    mysql仿oracle的decode效果查询

    以下代码在MYSQL中测试通过,MSSQL... #mysql执行 select sum(case when c = ‘1’ then A else B end) from tmp #oracle执行 select sum(decode(c,’1′,a,b)) from tmp #普通联合查询 select sum(d) from ( select

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...

Global site tag (gtag.js) - Google Analytics