简体   繁体   English

Oracle 12C SQL 聚合查询逻辑

[英]Oracle 12C SQL Aggregate Query Logic

I need help in writing SQL query for below mixed aggregation scenario: Consider below Emp Table.我需要帮助编写 SQL 查询以用于以下混合聚合场景:考虑下面的 Emp Table。 Need to aggregate employee records by manager.需要按经理汇总员工记录。

Aggregaton Logic: Need top Rating under manager.聚合逻辑:需要经理下的最高评级。 Eg.例如。 for Mgr 10, Rating should be Super, For 30, Good对于经理 10,评级应该是超级,对于 30,好

Need EmpDesig and Dob for emp with least rating.对于评级最低的 emp,需要 EmpDesig 和 Dob。 Sal and Bonus should be aggregated by Sum(). 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

So Output for above Dataset should be所以上述数据集的 Output 应该是

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

I tried building logic with below query but could not.我尝试使用以下查询构建逻辑,但不能。

   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

This is conditional aggregation.这是条件聚合。 I think the key is to enumerate the ratings:我认为关键是要列举收视率:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM