只计算同时拥有工资和奖金的员工

问题描述 投票:0回答:1

我有一个表,我需要为 count(distinct(pay_type)) > 1 的员工创建一个计算字段,其中包含总薪酬。 当 count(distinct(pay_type)) > 1 为 true 时,我希望金额列旁边的列中包含总金额。 我的方法是使用窗口函数和某种 CASE 语句,但无法弄清楚。

我当前的查询是:

Select check_num, emp_id, name, pay_type, sum(amount) as amt
from employee_paystubs
group by check_num, emp_id, name, pay_type
order by check_num desc;

这是结果数据:

CHECK_NUM EMP_ID 姓名 PAY_TYPE AMT
01 1 杰夫 薪资 1500
02 2 鲍勃 薪资 2000
03 2 鲍勃 薪资 2000
04 2 鲍勃 奖金 1000
05 5 杰克 薪资 1800
06 6 梅根 薪资 1900

这是我想要的输出:

CHECK_NUM EMP_ID 姓名 PAY_TYPE AMT NEW_COL
01 1 杰夫 薪资 1500
02 2 鲍勃 薪资 2000
03 2 鲍勃 薪资 2000
04 2 鲍勃 奖金 1000 5000
05 5 杰克 薪资 1800
06 6 梅根 薪资 1900

谢谢你。

PS 我正在使用 Oracle。

sql window-functions
1个回答
0
投票

为了在 Oracle 中实现所需的输出,您需要结合使用窗口函数和 CASE 语句。窗口函数将帮助您计算数据集中每个 emp_id 的 pay_type 的不同计数以及每个 emp_idamount 总和。一旦有了这些,您就可以使用 CASE 语句在具有多个不同 pay_type 的员工旁边显示总金额。

以下是修改查询的方法:

SELECT 
check_num, 
emp_id, 
name, 
pay_type, 
amt,
CASE 
    WHEN count_distinct_pay_type > 1 THEN total_amount 
    ELSE NULL 
END AS new_col
FROM (
    SELECT 
    check_num, 
    emp_id, 
    name, 
    pay_type, 
    SUM(amount) OVER (PARTITION BY check_num, emp_id, name, pay_type) as amt,
    COUNT(DISTINCT pay_type) OVER (PARTITION BY emp_id) as count_distinct_pay_type,
    SUM(amount) OVER (PARTITION BY emp_id) as total_amount
FROM 
    employee_paystubs
) 
ORDER BY check_num DESC;

让我们分解一下内部查询:

  • SUM(amount) OVER (PARTITION BY check_num, emp_id, name, pay_type) 计算每组 check_num, emp_id, name, pay_type 的金额。
  • COUNT(DISTINCT pay_type) OVER (PARTITION BY emp_id) 计算每个 emp_idpay_type 的不同计数。
  • SUM(amount) OVER (PARTITION BY emp_id) 计算每个 emp_id 的总金额。
外部查询然后使用 CASE 语句在

count_distinct_pay_type 大于 1 的行旁边显示 total_amount。如果计数不大于 1,则在 new_col 中显示 NULL。

希望可以帮助您解决问题:)

© www.soinside.com 2019 - 2024. All rights reserved.