【问题标题】:Oracle 12C SQL Aggregate Query LogicOracle 12C SQL 聚合查询逻辑
【发布时间】:2020-03-10 19:10:06
【问题描述】:

我在为以下混合聚合场景编写 SQL 查询时需要帮助: 考虑下面的 Emp 表。需要按经理汇总员工记录。

聚合逻辑: 需要经理下的最高评级。 例如。对于经理 10,评级应该是超级,对于 30,好

对于评分最低的 emp,需要 EmpDesig 和 Dob。 Sal 和 Bonus 应该由 Sum() 聚合。

   Mgr Emp Rating  EmpSal EmpDesig Bonus     Dob
   10  11   Avg      1000   JE        50   Jan-85
   10  12   Good     1500   SE        30   Mar-85
   10  12   Super    2000   ASE       60   Mar-84
   20  21   Good     1000   SE        40   Apr-85
   20  22   Avg      1000   AST       45   Dec-86
   30  31   Good     500    SE        80   Oct-85
   30  32   Good     1000   ASE       70   Jan-87
   30  33   Avg      1500   ASC       90   Nov-85
   30  34   Avg      500    JE       20    Jan-89

所以上述数据集的输出应该是

   Mgr Rating  EmpSal EmpDesig Bonus     Dob
   10   Super    4500   JE       140   Jan-85
   20   Good     2000   AST      85    Dec-86
   30   Good     3500   JE       260   Jan-89

       Create table emp(MgrID number, EmpID number, varchar2(30),EmpSal number, EmpDesig 
      varchar2(30),
      Bonus number,    Dob varchar2(30));
      insert into emp values (10,  11,   'Avg',      1000,   'JE',        50,   'Jan-85');
      insert into emp values (10,  12,   'Good',     1500,   'SE',        30,   'Mar-85');
      insert into emp values (10,  12,   'Super',    2000,   'ASE',       60,   'Mar-84');
      insert into emp values (20,  21,   'Good',     1000,   'SE',        40,   'Apr-85');
      insert into emp values (20,  22,   'Avg',      1000,   'AST',       45,   'Dec-86');
      insert into emp values (30,  31,   'Good',     500,   'SE',        80,   'Oct-85');
      insert into emp values (30,  32,   'Good',    1000,   'ASE',       70,   'Jan-87');
      insert into emp values (30,  33,   'Avg',      1500,   'ASC',       90,   'Nov-85');
      insert into emp values (30,  34,   'Avg',      500,   'ASC',       90,   'Jan-89');

我尝试使用以下查询构建逻辑但不能。

   Select mgr, 
    max(rating) over (partition by mgr order by case Rating when 'Super' then 1 when 'Good' then 2 
    when 'Avg' then 3 end) rating,
    row_number () over (partition by mgr order by case Rating when 'Super' then 1 when 'Good' then 2 
    when 'Avg' then 3 end) rating_rnk,
    sum(empSal),
    sum(bonus),
    max(empdesig) over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2 
    when 'Avg' then 1 end) empdesig,
    row_number () over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2 
    when 'Avg' then 1 end) empdesig_rnk,

    max(dob) over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 2 when 
    'Avg' then 1 end) dob,
     row_number () over (partition by mgr order by case Rating when 'Super' then 3 when 'Good' then 
     2 when 'Avg' then 1 end) dob_rnk
    from 
    emp
    group by mgr

【问题讨论】:

    标签: sql oracle analytics aggregate-functions


    【解决方案1】:

    这是条件聚合。我认为关键是要列举收视率:

    SELECT mgrid,
        (
            CASE MIN(rating_order)
                WHEN 1   THEN 'Super'
                WHEN 2   THEN 'Good'
                WHEN 3   THEN 'Avg'
            END
        ) AS max_rating,
        MAX(empdesig) KEEP (dense_rank first order by rating_order desc, empid) AS empdesig,
        MAX(dob) KEEP (dense_rank first order by rating_order desc, empid) AS dob,
        SUM(empsal) AS sal, 
        SUM(bonus)
    FROM (SELECT e.*, 
             (
                 CASE rating
                     WHEN 'Super' THEN 1
                     WHEN 'Good' THEN 2
                     WHEN 'Avg' THEN 3 end ) as rating_order
                 FROM emp e
             ) e GROUP BY mgrid;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多