使用外部联接计算Oracle中的不同值

时间:2018-04-17 04:21:40

标签: oracle join

我的问题是关于左外连接与计数器。我有两张桌子。

employee:
empid empname
----- -------
  101 Tom
  102 Jerry
  103 Jack 
  104 Tim 

allocation:
generator analyzer tester
--------- -------- ------
     101       102    103
     103       102    101
     102       101    104

我需要以下结果

empid  empname generator analyzer  tester
------ ------- --------- -------- -------
101    Tom             1        1       1
102    Jerry           1        2       0
103    Jack            1        0       1
104    Tim             0        0       1

我需要计算每项任务的价值。汤姆已经生成1,分析1 和测试1.就像我需要计算值。这可能吗? SQL。如果可以,请帮助我获得输出。

我得到了结果。但这不是预期的。我使用外连接来解决问题,

select  
    e.empid,
    e.empname,
    count(a1.generator),
    count(a2.analyzer),
    count(a3.tester)
from employee e 
    left join allocation a1 
        on e.empid=a1.author
    left join allocation a2 
        on e.empid=a2.reviewer
    left join allocation a3 
        on e.empid=a3.tester 
group by 
    e.empid,
    e.empname;

2 个答案:

答案 0 :(得分:0)

你可以用这个来实现它:

Select empid,sum(generaor),sum(analyzer),sum(tester)
from 
(
Select empid,count(a.generaor) generaor,0 analyzer,0 tester
from employee    
JOIN Allocation a on empid=a.generaor group by empid,a.generaor
UNION 
Select empid,0 generaor,count(b.analyzer)analyzer,0 tester
from employee  
JOIN Allocation b on empid=b.analyzer  group by empid,b.analyzer
UNION 
Select empid,0 generaor,0 analyzer,count(c.tester) tester
from employee    
JOIN Allocation c on empid=c.tester  group by empid,c.tester
) stag
group by empid

答案 1 :(得分:0)

试试这个

SELECT empid, empname, sum(generator), sum(analyzer), sum(tester) FROM
(SELECT e.empid, e.empname, count(a1.generator) generator, 0 analyzer, 0 tester
FROM Employee e 
JOIN Allocation a1 ON a1.generator = e.empid 
GROUP BY e.empname
UNION 
SELECT e.empid, e.empname, 0 generator, count(a2.analyzer) analyzer, 0 tester
FROM Employee e 
JOIN Allocation a2 ON a2.analyzer = e.empid 
GROUP BY e.empname
UNION 
SELECT e.empid, e.empname, 0 generator, 0 analyzer, count(a3.tester) tester
FROM Employee e 
JOIN Allocation a3 ON a3.tester = e.empid
GROUP BY e.empname) tmp
GROUP BY empname 
ORDER BY empid