【问题标题】:how to solve a single-grouping problem in oracle sql如何解决oracle sql中的单分组问题
【发布时间】:2020-01-31 03:21:47
【问题描述】:

我正在尝试使用 oracle 中提供的 EMP 表来练习透视,方法是选择 job 作为列,ename 作为值。 这是我目前得到的查询。

     select distinct job, count(job) from emp group by job ... (A)
     -- Result)
     -- CLERK 4 
     -- SALESMAN 4
     -- PRESIDENT 1
     -- MANAGER 3
     -- ANALYST 2
    select t1.ename, t2.ename, t3.ename, t4.ename, t5.ename
    from
        (select ename, rank() over (order by ename) as n from emp where job = 'CLERK') t1, 
        (select ename, rank() over (order by ename) as n from emp where job = 'SALESMAN') t2, 
        (select ename, rank() over (order by ename) as n from emp where job = 'PRESIDENT') t3, 
        (select ename, rank() over (order by ename) as n from emp where job = 'MANAGER') t4, 
        (select ename, rank() over (order by ename) as n from emp where job = 'ANALYST') t5, 
        (select ename, rank() over (order by ename) as n from emp where job = 
        (select job ... (C)
        from emp 
        group by job
        having count(*) = (
            select max(count(*))
            from emp 
            group by job))
    ) t6 
    where t6.n = t1.n(+)
        and t6.n = t2.n(+)
        and t6.n = t3.n(+)
        and t6.n = t4.n(+)
        and t6.n = t5.n(+)
    order by t6.n;
    output: ORA-00937: not a single-group group function ... (B)

但是输出是 (B),因为从 (A) 中可以看出,有两个工作(文员、销售员)的值均为 4。

问题)
有没有办法修改(C),所以它只会选择一个作业,尽管(A),因为我只想为所有作业创建足够的列以在旋转后适应?

希望我说清楚了。

* 完成查询 *

  select t1.ename "Clerk", t2.ename "Salesman", t3.ename "President", t4.ename "Manager", t5.ename "Analyst"
            from
                (select ename, rank() over (order by ename) as n from emp where job = 'CLERK') t1, 
                (select ename, rank() over (order by ename) as n from emp where job = 'SALESMAN') t2, 
                (select ename, rank() over (order by ename) as n from emp where job = 'PRESIDENT') t3, 
                (select ename, rank() over (order by ename) as n from emp where job = 'MANAGER') t4, 
                (select ename, rank() over (order by ename) as n from emp where job = 'ANALYST') t5, 
                (select ename, rank() over (order by ename) as n from emp where job = 
                    (select job
                    from
                        (select *
                        from (
                            select job, count(job)
                            from emp
                            group by job
                            order by count(job) desc) 
                        where rownum = 1))) t6
                where t6.n = t1.n(+)
                and t6.n = t2.n(+)
                and t6.n = t3.n(+)
                and t6.n = t4.n(+)
                and t6.n = t5.n(+)
            order by t6.n;

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    如果您使用的是 oracle 12c 或更高版本,您可以使用FETCH 子句,如下所示:

    select job, count(job) 
      from emp
    group by job 
    ORDER BY COUNT(JOB) DESC
    FETCH FIRST ROW ONLY
    

    如果您使用的是较低版本的 oracle,则可以使用 analytical function,如下所示:

    Select job, cnt from
    (select job, count(job) cnt, row_number() over (order by count(job) desc) as rn
      from emp
     group by job)
    Where rn = 1
    

    干杯!!

    【讨论】:

    • 您的查询肯定有效,但我无法将其与上述内容结合起来,但我想这是我的工作。我应该指定我正在使用的版本。谢谢!
    猜你喜欢
    • 2010-09-11
    • 2020-06-12
    • 1970-01-01
    • 2012-04-05
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多