• 表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点


    异同点
    • 都可以对表行转列;
    • DECODE功能上和简单Case函数比较类似,不能像Case搜索函数一样,进行更复杂的判断
    • 在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)
    DECODE方法 (Oracle公司独家)

    decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

    --该函数的含义如下:    
    IF    条件=值1 THEN RETURN(翻译值1)   
    ELSIF 条件=值2 THEN RETURN(翻译值2)  
        ......  
    ELSIF 条件=值n THEN RETURN(翻译值n)  
    ELSE  RETURN(缺省值)  
    END IF   
    --行转列
    SELECT name,  
           SUM(DECODE(Subject, '数学', Score, 0)) 数学,  
           SUM(DECODE(Subject, '语文', Score, 0)) 语文,  
           SUM(DECODE(Subject, '英语', Score, 0)) 英语  
    FROM Scores 
    GROUP BY name  
    CASE WHEN
    SELECT name,
    SUM( CASE WHEN Subject='数学' THEN Score ELSE 0 END) 数学,
    SUM( CASE WHEN Subject='语文' THEN Score ELSE 0 END) 语文,
    SUM( CASE WHEN Subject='英语' THEN Score ELSE 0 END) 英语
    FROM Scores group by name;

    Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略,Else部分的默认值是NULL

    Case具有两种格式,简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式

    在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)

    --简单Case函数
    CASE sex
    WHEN '1' THEN '男'
    WHEN '2' THEN '女'
    ELSE '其他' END
    
    --Case搜索函数 
    CASE 
    WHEN sex = '1' THEN '男' 
    WHEN sex = '2' THEN '女' 
    ELSE '其他' END  
    
    --根据条件有选择的UPDATE。
    UPDATE Scores  SET grade = 
    CASE WHEN score >= 85 THEN '优秀'
         WHEN score >= 70 AND score < 85  THEN '良好' 
         WHEN score >= 60 AND score < 70  THEN '及格'
    ELSE '不及格' END; 
    
    --在Case函数中使用聚合函数:COUNT, SUM, AVG, MAX, MIN
    SELECT  name, 
    CASE WHEN COUNT(*) = 1 THEN MAX(subject) 
    ELSE MAX(CASE WHEN major = 'Y'  THEN subject ELSE NULL END) 
    END AS major_subject
    FROM Scores  GROUP BY name; 
    Scores表结构和实现如下

    image
    image

  • 相关阅读:
    1014 Waiting in Line (30)(30 point(s))
    1013 Battle Over Cities (25)(25 point(s))
    1012 The Best Rank (25)(25 point(s))
    1011 World Cup Betting (20)(20 point(s))
    1010 Radix (25)(25 point(s))
    1009 Product of Polynomials (25)(25 point(s))
    1008 Elevator (20)(20 point(s))
    1007 Maximum Subsequence Sum (25)(25 point(s))
    1006 Sign In and Sign Out (25)(25 point(s))
    1005 Spell It Right (20)(20 point(s))
  • 原文地址:https://www.cnblogs.com/niudaxianren/p/10018715.html
Copyright © 2020-2023  润新知