2015-05-27 2 views
0

Я пишу запрос, чтобы получить информацию о преимуществах сотрудников. Мне нужно получить сумму вычетов разных планов и вариантов. Для суммы вычета в таблице есть одно поле. Я собираю это поле несколько раз для разных планов и вариантов. Я сделал это с помощью подзапросов. Но мой запрос возвращает несколько строк одного сотрудника, а в нескольких строках отображает его количество. Я хочу, чтобы все суммы вычетов были в одной строке для одного сотрудника.Получение нескольких строк одного сотрудника при использовании подзапросов в SQL

Это, как я написал запрос: -

select papf.person_number, csv.salary_amount, (select bprv.rt_val from ben_prtt_rt_val bprv, 
    ben_opt_f bof, 
    ben_pl_f bpf, 
    ben_pl_typ_f bpt where bprv.prtt_enrt_rslt_id=bper.prtt_enrt_rslt_id and bper.pl_typ_id=bpt.pl_typ_id and bpf.pl_typ_id=bpt.pl_typ_id and bper.pl_id=bpf.pl_id and bper.opt_id=bof.opt_id and bpt.name ='abcd' and bpf.name='abcd' and bof.name='Participant' 
and (sysdate between bof.effective_start_Date and bof.effective_end_Date) 
    and (sysdate between bpt.effective_start_Date and bpt.effective_end_Date) 
    and (sysdate between bpf.effective_start_Date and bpf.effective_end_Date)) as "abcd Amount", 
(select bprv1.rt_val from ben_prtt_rt_val bprv1,ben_opt_f bof1, 
    ben_pl_f bpf1, 
    ben_pl_typ_f bpt1 where bprv1.prtt_enrt_rslt_id=bper.prtt_enrt_rslt_id and bper.pl_typ_id=bpt1.pl_typ_id and bpf1.pl_typ_id=bpt1.pl_typ_id and bper.opt_id=bof1.opt_id and bper.pl_id=bpf1.pl_id and bpt1.name ='efgh' and bpf1.name='efgh' and bof1.name='Participant' 
and (sysdate between bof1.effective_start_Date and bof1.effective_end_Date) 
    and (sysdate between bpt1.effective_start_Date and bpt1.effective_end_Date) 
    and (sysdate between bpf1.effective_start_Date and bpf1.effective_end_Date)) as "efgh Amount", 
(select bprv2.rt_val from ben_prtt_rt_val bprv2,ben_opt_f bof2, 
    ben_pl_f bpf2, 
    ben_pl_typ_f bpt2 where bprv2.prtt_enrt_rslt_id=bper.prtt_enrt_rslt_id and bper.pl_typ_id=bpt2.pl_typ_id and bpf2.pl_typ_id=bpt2.pl_typ_id and bper.opt_id=bof2.opt_id and bper.pl_id=bpf2.pl_id and bpt2.name ='ijkl' and bpf2.name='ijkl' and bof2.name='Participant' 
and (sysdate between bof2.effective_start_Date and bof2.effective_end_Date) 
    and (sysdate between bpt2.effective_start_Date and bpt2.effective_end_Date) 
    and (sysdate between bpf2.effective_start_Date and bpf2.effective_end_Date)) as "ijkl Amount" 
from 
    ben_prtt_enrt_rslt bper, 
    per_all_people_f papf , 
    cmp_salary csv 
where 
    bper.assignment_id=csv.assignment_id  
    and bper.person_id=papf.person_id  
    and (sysdate between papf.effective_start_Date and papf.effective_end_Date) 
    AND CSV.DATE_TO=(SELECT MAX(CSV1.DATE_TO) FROM CMP_SALARY CSV1 WHERE CSV.ASSIGNMENT_ID=CSV1.ASSIGNMENT_ID) 

Я хочу результат, как это: -

Employee  Salary abcd_amt efgh_amt  ijkl_amt 
1234    10000  200   300   400 

Но с помощью запроса я получаю результат, как это: -

Employee Salary abcd_amt   efgh_amt   ijkl_amt 
1234  10000 200    
1234  10000      300   
1234  10000           400 

а также повторяющиеся строки.

Пожалуйста, помогите мне. Как я могу решить эту проблему?

+0

вы можете добавить свои макеты таблицы и некоторые данные? Я думаю, что это можно сделать легко с помощью соединений, но на самом деле не очень хорошо понимают, как выглядят ваши таблицы. –

+0

Мне кажется, что вы должны группировать свои данные на основе сотрудника. Таким образом, вы получите одну строку на одного сотрудника – istovatis

ответ

0

Просто добавьте группу, и Макс в запросе, как это:

select papf.person_number as Employee, csv.salary_amount as Salary 
max(-query of abcd_amt-) as abcd Amount, 
max(-query of efgh_amt-)as efgh Amount, 
max(-query of ijkl_amt-) as abcd Amount 
from --tables names 
where -- where condition 
group by papf.person_number, csv.salary_amount; 
+0

Это не позволяет мне группировать papf.person_number с максимальной функцией. – User

+0

Извините, что я забыл добавить сумму зарплаты в группу .. ее работа сейчас .. спасибо .. – User