英文:
Oracle SQL query to get the sum of elements for an employee
问题
I have translated the content you provided:
我有一张表格,其中包含与相应输入值对应的元素的多个值:
EE ELEMENT_NAME RESULT_VALUE EFFECTIVE DATE INPUT VALUE
10 REGULAR RETRO 3457 10-APR-2023 earning
10 REGULAR RETTO -3454 10-APR-2023 earning
10 REGULAR SALAR 34000 10-APR-2023 Pay
11 REGULAR SALAR 670000 10-APR-2023 earning
11 DENTAL SALAR 100 10-APR-2023 Pay
11 HEALTH SALAR 2000 10-APR-2023 Pay
11 Car SALAR 2000 10-APR-2023 Pay
12 EE RETRO -3000 10-APR-2023 Pay
12 REGULAR RETRO 1000 10-APR-2023 earning
12 REGULAR RETRO -890 10-APR-2023 earning
12 Tax RETRO -890 10-APR-2023 earning
所需的输出是:
EE REGULAR_RETRO REGULAR_SALAR DENTAL_SALAR HEALTH_SALAR EE_RETRO
10 3 34000
11 670000 100 2000
12 110 -3000
以下查询仅适用于我在查询的“where子句”中定义的特定元素,但尽管我使用了group by,但仍然为同一名员工获取多行。而且输出还没有汇总回退值(常规回退),而是提供了重复的行。
我使用的查询是:
select ee person_number,
case when peen.element_name in 'REGULAR RETRO'
then sum (RESULT_VALUE) REGULAR_RETRO,
case when peen.element_name in 'REGULAR SALAR'
then sum (RESULT_VALUE) REGULAR_SALAR,
case when peen.element_name in 'DENTAL SALAR'
then sum (RESULT_VALUE) DENTAL_SALAR,
case when peen.element_name in 'HEALTH SALAR'
then sum (RESULT_VALUE) HEALTH_SALAR,
case when peen.element_name in 'EE RETRO'
then sum (RESULT_VALUE) EE_RETRO
FROM
PER_ALL_PEOPLE_F PAPF
PER_ELEMENT_NAME PEEN,
PEr_ELEMENT_TYPE PET
WHERE
PAPF.PERSON_ID = PEEN.PERSON_ID
AND PEEN.ELEMENT_ID = PET.ELEMENT_ID
AND PET.INPUT_VALUE IN ('Pay','Earning')
and peen.element_name in
(
'REGULAR SALAR',
'DENTAL SALAR',
'HEALTH SALAR',
'EE RETRO',
'REGULAR RETRO'
)
group by person_number,
peen.element_name
Please note that this translation is based on the provided text, and the code contains some HTML entities (e.g., "
) that may need to be adjusted depending on the actual programming environment you are using.
英文:
I have a table with multiple values of elements for an element with corresponding input values:
EE ELEMENT_NAME RESULT_VALUE EFFECTIVE DATE INPUT VALUE
10 REGULAR RETRO 3457 10-APR-2023 earning
10 REGULAR RETTO -3454 10-APR-2023 earning
10 REGULAR SALAR 34000 10-APR-2023 Pay
11 REGULAR SALAR 670000 10-APR-2023 earning
11 DENTAL SALAR 100 10-APR-2023 Pay
11 HEALTH SALAR 2000 10-APR-2023 Pay
11 Car SALAR 2000 10-APR-2023 Pay
12 EE RETRO -3000 10-APR-2023 Pay
12 REGULAR RETRO 1000 10-APR-2023 earning
12 REGULAR RETRO -890 10-APR-2023 earning
12 Tax RETRO -890 10-APR-2023 earning
The required output is:
EE REGULAR_RETRO REGULAR_SALAR DENTAL_SALAR HEALTH_SALAR EE_RETRO
10 3 34000
11 670000 100 2000
12 110 -3000
The below query I am using is only for specific elements that I am defining in "where clause" of my query, but I am getting multiple rows for the same employee although I am using group by.
And the output is also not summing up the retros values (regular retros) and is giving repeated rows instead.
The query I am using is:
select ee person_number,
case when peen.element_name in 'REGULAR RETRO'
then sum (RESULT_VALUE) REGULAR_RETRO,
case when peen.element_name in 'REGULAR SALAR'
then sum (RESULT_VALUE) REGULAR_SALAR,
case when peen.element_name in 'DENTAL SALAR'
then sum (RESULT_VALUE) DENTAL_SALAR,
case when peen.element_name in 'HEALTH SALAR'
then sum (RESULT_VALUE) HEALTH_SALAR,
case when peen.element_name in 'EE RETRO'
then sum (RESULT_VALUE) EE_RETRO
FROM
PER_ALL_PEOPLE_F PAPF
PER_ELEMENT_NAME PEEN,
PEr_ELEMENT_TYPE PET
WHERE
PAPF.PERSON_ID = PEEN.PERSON_ID
AND PEEN.ELEMENT_ID = PET.ELEMENT_ID
AND PET.INPUT_VALUE IN ('Pay','Earning')
and peen.element_name in
(
'REGULAR SALAR',
'DENTAL SALAR',
'HEALTH SALAR',
'EE RETRO',
'REGULAR RETRO'
)
group by person_number,
peen.element_name
答案1
得分: 2
这可以通过使用条件聚合和 group by
以及 sum()
来实现:
select EE,
sum(case when ELEMENT_NAME = 'REGULAR RETRO' then RESULT_VALUE else 0 end) as REGULAR_RETRO,
sum(case when ELEMENT_NAME = 'REGULAR SALAR' then RESULT_VALUE else 0 end) as REGULAR_SALAR,
sum(case when ELEMENT_NAME = 'DENTAL SALAR' then RESULT_VALUE else 0 end) as DENTAL_SALAR,
sum(case when ELEMENT_NAME = 'HEALTH SALAR' then RESULT_VALUE else 0 end) as HEALTH_SALAR,
sum(case when ELEMENT_NAME = 'EE RETRO' then RESULT_VALUE else 0 end) as EE_RETRO
from mytable
group by EE
结果:
EE |REGULAR_RETRO |REGULAR_SALAR |DENTAL_SALAR |HEALTH_SALAR |EE_RETRO
----|-----|----|---|---|----|---
10 |3 |34000 |0 |0 |0
11 |0 |670000 |100 |2000 |0
12 |110 |0 |0 |0 |-3000
英文:
This can be done using the conditional aggregation using group by
and sum()
:
select EE,
sum(case when ELEMENT_NAME = 'REGULAR RETRO' then RESULT_VALUE else 0 end) as REGULAR_RETRO,
sum(case when ELEMENT_NAME = 'REGULAR SALAR' then RESULT_VALUE else 0 end) as REGULAR_SALAR,
sum(case when ELEMENT_NAME = 'DENTAL SALAR' then RESULT_VALUE else 0 end) as DENTAL_SALAR,
sum(case when ELEMENT_NAME = 'HEALTH SALAR' then RESULT_VALUE else 0 end) as HEALTH_SALAR,
sum(case when ELEMENT_NAME = 'EE RETRO' then RESULT_VALUE else 0 end) as EE_RETRO
from mytable
group by EE
Result :
EE | REGULAR_RETRO | REGULAR_SALAR | DENTAL_SALAR | HEALTH_SALAR | EE_RETRO | |
---|---|---|---|---|---|---|
10 | 3 | 34000 | 0 | 0 | 0 | |
11 | 0 | 670000 | 100 | 2000 | 0 | |
12 | 110 | 0 | 0 | 0 | -3000 |
答案2
得分: 0
修复查询中的CASE语法并从“group by”中移除peen.element_name应该解决问题。
英文:
Fix the syntax of the CASE in your query and remove the peen.element_name from the "group by" should solve the problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论