我有一个表,我需要为 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。
为了在 Oracle 中实现所需的输出,您需要结合使用窗口函数和 CASE 语句。窗口函数将帮助您计算数据集中每个 emp_id 的 pay_type 的不同计数以及每个 emp_id 的 amount 总和。一旦有了这些,您就可以使用 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;
让我们分解一下内部查询:
count_distinct_pay_type 大于 1 的行旁边显示 total_amount。如果计数不大于 1,则在 new_col 中显示 NULL。
希望可以帮助您解决问题:)