zoukankan      html  css  js  c++  java
  • WITH分析函数 老猫

      create table test_1
      (
           x number(10),
           y number(10)
      );
     
      insert into test_1 values (1,110);
      insert into test_1 values (2,120);
      insert into test_1 values (2,80);
      insert into test_1 values (3,150);
      insert into test_1 values (3,30);
      insert into test_1 values (3,60);
      commit;
     
      select * from test_1;

             X          Y
    ---------- ----------
             1        110
             2        120
             2         80
             3        150
             3         30
             3         60

    6 rows selected.


    需求描述
    按照x列分组后统计y列的总值,是选出比y列总值的三分之一大的那些分组统计信息。


    1、使用子查询方式实现

      SELECT x, SUM(y) AS total_y
        FROM test_1
       GROUP BY x
      HAVING SUM(y) > (SELECT SUM(y) / 3 FROM test_1)
       ORDER BY total_y;

             X    TOTAL_Y
    ---------- ----------
             2        200
             3        240

    2、WITH Clause方法闪亮登场

       WITH secooler_sum AS (SELECT x, SUM (y) total_y
                                FROM test_1
                             GROUP BY x)
        SELECT x, total_y
         FROM secooler_sum
       WHERE total_y > (SELECT SUM (total_y) / 3 FROM secooler_sum)
       ORDER BY total_y;


             X    TOTAL_Y
    ---------- ----------
             2        200
             3        240
            
    这里的查询语句不是以select开始的,而是以"WITH"关键字开头。
    可以认为Oracle在真正进行查询之前预先构造了一个临时表secooler_sum,
    之后我们便可多次使用它做进一步的分析和处理。


    WITH Clause方法的优点
    总结:
    1、增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;
    2、"一次分析,多次使用",提供性能,达到了"少读"的目标。

  • 相关阅读:
    oracle添加字段,备注
    oracle对日期date类型操作的函数
    查询效率例子收藏
    webuploader.min.js 简单例子
    select 数字/字符串/count(参数)/sum(数字) from table
    oracle常用分析函数 over(partition by xxx order by xxx)
    LigerUi遮罩的两个方法
    LigerUI子父窗口之间传参问题
    LigerUi自动检索输入
    LigerUi折叠与展开
  • 原文地址:https://www.cnblogs.com/oldcat/p/2167975.html
Copyright © 2011-2022 走看看