I have table employees with column emp_id and emp_name, table elements containing column person_id and element_name such as Basic Salary, and table values containing column value_result such as 1500 and also contains rubbish data that is not wanted, in order to get rid of it I need to use table values_type containing column value_type,
select element_name , // e.g. Basic Salary
values // e.g. 1500,
emp_name // john
from values,values_type, elements,employees
join elements on elements.emp_id= employees.emp_id
and element_name IN ('Basic Salary', 'Transportation Allowance')
join values on values.element_id = elements.element_id
join values_type on values_type.value_id = values.value_id
and values_type.value_type = 'Amount` // in order to give me desirable values in numbers
this works fine, but it will give me 2 rows for each employee, one for Basic Salary and one for Transportation Allowance, what I want is to make 2 columns from element_name rows, those are Basic Salary and Transportation Allowance, then I want to bring the related rows (values) from table values under each column based on the condition types.value_type = 'Amount` from table values_type, how can I achieve that ?
sample result
emp_id element_name values
1 Basic Salary 1500
1 Transportation Allowance 200
wanted results
emp_id Basic Salary Transportation Allowance
1 1500 200
i've tried to join table values 2 times in order to use different conditions on columns :
select element_name , // e.g. Basic Salary
v1.values, // e.g. 1500 ( basic salary )
v2.values, // e.g. 200 ( transportation allowance )
emp_name, // john
from values,values_type, elements,employees
join elements on elements.emp_id= employees.emp_id
and element_name IN ('Basic Salary', 'Transportation Allowance')
left outer join values v1 on v1.values.element_id = elements.element_id
left outer join values v2 on v2.values.element_id = elements.element_id
join values_type on values_type.value_id = values.value_id
and values_type.value_type = 'Amount` // in order to give me desirable values in numbers
but then i need to join values_type to each one:
join values_type t1 on t1.values_type.value_id = v1.values.value_id
and t1.value_type = 'Amount` // in order to give me desirable values in numbers
join values_type t2 on t2.values_type.value_id = v2.values.value_id
and t2.value_type = 'Amount` // in order to give me desirable values in numbers
which will of course not work, it will give empty results, I've been stuck at this for 2 days now..
CodePudding user response:
May be something like this one
select emp_id, // e.g. Basic Salary
sum(decode(element_name,'Basic Salary',values,0)) Basic_Salary,
sum(decode(element_name,'Transportatiion Allowance',values,0)) Transportation_Allowance
from values,values_type, elements,employees
join elements on elements.emp_id= employees.emp_id
and element_name IN ('Basic Salary', 'Transportation Allowance')
join values on values.element_id = elements.element_id
join values_type on values_type.value_id = values.value_id
and values_type.value_type = 'Amount'
group by emp_id
