如何在oracle数据库中为具有复杂聚合的pivot编写等效的sql查询?

bmvo0sr5  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(375)

在spark中,我们可以用pivot提供复杂的聚合。例如

project.groupBy("mgr","job").pivot("job").agg(sum(project.col("salary")).alias("ss") * count("*").alias("c"))

关于以下数据,即项目
经理DeptnosalaryJobac10100Clerkapac20200管理人员AC20300管理人员Kapac10400管理人员JPAC201000管理人员JPAC102000管理人员A2010000管理人员EA204000管理人员A2030000管理人员
输出:
MgrJobClerkmanageremanagerNull40000JPACManagerNull2000eMeaclerk800000NullJPAcclerk1000NullApacclerk2400NullApacManagerNull200
我可以在oracle数据库中使用pivot编写类似的sql查询吗?

kulphzqa

kulphzqa1#

以下是两个你需要的版本(希望两者都能帮助你):
查询#1

select * from (
select mgr,job,salary from project
)
pivot
(
    sum(salary)
    for job in ('CLERK','MANAGER')
)

输出#1

MGR     JOB      'CLERK'    'MANAGER'
JPAC    CLERK    1000    - 
JPAC    MANAGER   -          2000
APAC    CLERK    800         - 
APAC    MANAGER   -          200
EMEA    CLERK    40000   - 
EMEA    MANAGER   -          40000

查询#2:

select * from (
select mgr,job,salary from project
)
pivot
(
    sum(salary)
    for Job  in ('CLERK','MANAGER')
)

输出#2:

MGR    'CLERK'  'MANAGER'
EMEA    40000    40000
APAC    800      200
JPAC    1000     2000
  • 查询#3(sum()count()):
select * from (
select mgr,job,job JobToPivot,sum(salary)*count(*) salary from project
group by mgr,job
)
pivot
(
    max(salary)
    for JobToPivot  in ('CLERK','MANAGER')
)

输出#3:

MGR     JOB     'CLERK' 'MANAGER'
JPAC    CLERK    1000    - 
JPAC    MANAGER  -       2000
APAC    CLERK    2400    - 
APAC    MANAGER  -       200
EMEA    CLERK    80000   - 
EMEA    MANAGER  -       40000
  • 查询#4(sum()count()):
select * from (
select mgr,job,sum(salary)*count(*) salary from project
group by mgr,job
)
pivot
(
    max(salary)
    for Job  in ('CLERK','MANAGER')
)

输出#4:

MGR    'CLERK'  'MANAGER'
EMEA    80000   40000
APAC    2400    200
JPAC    1000    2000
ax6ht2ek

ax6ht2ek2#

你的结果对我来说毫无意义。其中一个不是更有用吗?

select mgr, job, sum(salary)
from project
group by mgr, job;

这将为每个行创建一个单独的行 mgr 以及 job ,但只有一份薪水。
或:

select mgr,
       sum(case when job = 'CLERK' then salary end) as clerk,
       sum(case when job = 'MANAGER' then salary end) as manager
from project
group by mgr;

每行有一行 mgr 在两个薪资列中填充薪资。
这两个都是标准的sql(不像 pivot )应该在任何数据库中运行。

相关问题