zoukankan      html  css  js  c++  java
  • decode、sign、case在统计中的用法:

    参考网址:http://www.skillbuilders.com/download/download-sample.cfm?course=adv-sql-queries&file=Adv%20SQL%20Queries%20for%20Oracle%2002%20Decode%20and%20CASE%20Notes.pdf

    说明:

    在统计中用到的MAX聚集函数也可以用sum、min、avg等其他聚集函数替代。用sign和decode来完成比较字段大小来区某个字段

    1 select decode(sign(字段1-字段2),-1,字段3,字段4) from dual;

    1、使用case进行直方图的统计:

    统计工资在各个区间的人数:

     1 SELECT SUM(CASE
     2              WHEN t.sal < 1000 THEN
     3               1
     4              ELSE
     5               0
     6            END) "小于1000",
     7        SUM(CASE
     8              WHEN t.sal >= 1000 AND t.sal < 2000 THEN
     9               1
    10              ELSE
    11               0
    12            END) "1000-2000",
    13        SUM(CASE
    14              WHEN t.sal >= 2000 AND t.sal < 3000 THEN
    15               1
    16              ELSE
    17               0
    18            END) "2000-3000",
    19        
    20        SUM(CASE
    21              WHEN t.sal >= 3000 AND t.sal < 4000 THEN
    22               1
    23              ELSE
    24               0
    25            END) "3000-4000",
    26        SUM(CASE
    27              WHEN t.sal >= 4000 THEN
    28               1
    29              ELSE
    30               0
    31            END) "大于4000"
    32   FROM emp t

    结果:

    统计在这个区间具体的人:

     1 SELECT SUM(CASE
     2              WHEN t.sal < 1000 THEN
     3               1
     4              ELSE
     5               0
     6            END) "小于1000",
     7        wm_concat(CASE
     8                    WHEN t.sal < 1000 THEN
     9                     ename
    10                  END) "小于1000的具体人",
    11        SUM(CASE
    12              WHEN t.sal >= 1000 AND t.sal < 2000 THEN
    13               1
    14              ELSE
    15               0
    16            END) "1000-2000",
    17        wm_concat(CASE
    18                    WHEN t.sal >= 1000 AND t.sal < 2000 THEN
    19                     ename
    20                  END) "1000-2000的具体人",
    21        SUM(CASE
    22              WHEN t.sal >= 2000 AND t.sal < 3000 THEN
    23               1
    24              ELSE
    25               0
    26            END) "2000-3000",
    27        wm_concat(CASE
    28                    WHEN t.sal >= 2000 AND t.sal < 3000 THEN
    29                     ename
    30                  END) "2000-3000的具体人",
    31        
    32        SUM(CASE
    33              WHEN t.sal >= 3000 AND t.sal < 4000 THEN
    34               1
    35              ELSE
    36               0
    37            END) "3000-4000",
    38        wm_concat(CASE
    39                    WHEN t.sal >= 3000 AND t.sal < 4000 THEN
    40                     ename
    41                  END) "3000-4000的具体人",
    42        SUM(CASE
    43              WHEN t.sal >= 4000 THEN
    44               1
    45              ELSE
    46               0
    47            END) "大于4000",
    48        wm_concat(CASE
    49                    WHEN t.sal >= 4000 THEN
    50                     ename
    51                  END) "大于4000的具体人"
    52   FROM emp t

    结果:

    统计成行列格式:

     1 SELECT CASE
     2          WHEN t.sal < 1000 THEN
     3           '大于2000'
     4          WHEN t.sal >= 1000 AND t.sal < 2000 THEN
     5           '1000-2000'
     6          WHEN t.sal >= 2000 AND t.sal < 3000 THEN
     7           '2000-3000'
     8          WHEN t.sal >= 3000 AND t.sal < 4000 THEN
     9           '3000-4000'
    10          WHEN t.sal >= 4000 THEN
    11           '大于或等于4000'
    12        END "工资分布",
    13        COUNT(1) 数量
    14   FROM emp t
    15  GROUP BY CASE
    16             WHEN t.sal < 1000 THEN
    17              '大于2000'
    18             WHEN t.sal >= 1000 AND t.sal < 2000 THEN
    19              '1000-2000'
    20             WHEN t.sal >= 2000 AND t.sal < 3000 THEN
    21              '2000-3000'
    22             WHEN t.sal >= 3000 AND t.sal < 4000 THEN
    23              '3000-4000'
    24             WHEN t.sal >= 4000 THEN
    25              '大于或等于4000'
    26           END

    也可以将第一组的case进行列转行得到如下的结果:

     1 WITH t AS
     2  (SELECT SUM(CASE
     3                WHEN t.sal < 1000 THEN
     4                 1
     5                ELSE
     6                 0
     7              END) a,
     8          
     9          SUM(CASE
    10                WHEN t.sal >= 1000 AND t.sal < 2000 THEN
    11                 1
    12                ELSE
    13                 0
    14              END) b,
    15          SUM(CASE
    16                WHEN t.sal >= 2000 AND t.sal < 3000 THEN
    17                 1
    18                ELSE
    19                 0
    20              END) c,
    21          
    22          SUM(CASE
    23                WHEN t.sal >= 3000 AND t.sal < 4000 THEN
    24                 1
    25                ELSE
    26                 0
    27              END) d,
    28          SUM(CASE
    29                WHEN t.sal >= 4000 THEN
    30                 1
    31                ELSE
    32                 0
    33              END) e
    34     FROM emp t)
    35 SELECT '小于1000',
    36        t.a
    37   FROM t
    38 UNION ALL
    39 SELECT '1000-2000',
    40        t.b
    41   FROM t
    42 UNION ALL
    43 SELECT '2000-3000',
    44        t.c
    45   FROM t
    46 UNION ALL
    47 SELECT '3000-4000',
    48        t.d
    49   FROM t
    50 UNION ALL
    51 SELECT '大于4000',
    52        t.e
    53   FROM t

    也可以进行列转行:

    使用SIGN进行统计:

    SIGN函数的说明:sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

  • 相关阅读:
    [LeetCode] Min Stack
    [LeetCode] Find Minimum in Rotated Sorted Array
    [LeetCode] Maximum Product Subarray
    [Jobdu] 题目1504:把数组排成最小的数
    [Jobdu] 题目1544:数字序列区间最小值
    Python2.3-原理之语句和语法
    Python2.5-原理之模块
    Vim2.1-Vim简明教程【CoolShell】【非原创】
    Python2.6-原理之类和oop(下)
    QT1.1-与Opencv的hello world
  • 原文地址:https://www.cnblogs.com/caroline/p/2765074.html
Copyright © 2011-2022 走看看