2010-11-18 86 views
0

我想从两个表中获得结果,这两个表按照一个选择中的相同规则分组在一起。连接来自两个sql表的结果

我有表1

create table person AS 
id INTEGER, 
gender INTEGER, 
state VARCHAR2 
name VARCHAR2 
surname VARCHAR2 

表2

create table sampletest as 
person_id FOREIGN KEY To person.id 
result INTEGER 

表3

create table examtest as 
person_id FOREIGN KEY to person.id 
examresult INTEGER 

我谨状态得到这个输出

组|按性别分组|计数(检验> 0)|数(结果> 0,并导致< 4)

我想是这样的

select state,gender,count(e.examresult),count(s.result) where 
p.id=s.person_id and p.id=e.person_id and 
s.result>0 and s.result<4 and 
e.examresult>0 group by state,gender 

,但我得到的结果依赖于对方。我如何获得独立的结果到一个选择?

回答

0

构建子选择

select 
    p.state, 
    p.gender, 
    sum( 
    (select count(1) from examtest e 
     where e.personid = p.personid 
     and e.examresult > 0)) as examcount, 
    sum( 
    (select count(1) from sampletest s 
     where s.personid = p.personid 
     and s.result > 0 and s.result < 4)) as samplecount 
from 
    person p 
group by 
    p.state, 
    p.gender 
+0

你能帮助更多一点,我需要状态数0,即不要有e.examresult由0,1,2,3,4分组性别,5 – damir 2010-11-18 19:22:57

+0

从性能角度来看,相关子查询是一个糟糕的解决方案。这绝不应该是你的第一选择。 – HLGEM 2010-11-18 21:44:52

+0

我写这样的查询,有时长达数百行,而且他们通常胜过其他解决方案。这可能取决于您使用的数据库。使用Oracle时,经验法则是查询看起来越糟糕,通常执行得越好。但是,在其他答案中的左侧加入可能会很好,甚至更好。 – GolezTrol 2010-11-19 08:28:29

3
SELECT state,gender, 
     SUM(CASE WHEN e.examresult > 0 THEN 1 ELSE 0 END) AS EXAM_GT_ZERO, 
     SUM(CASE WHEN s.result BETWEEN 0 AND 4 THEN 1 ELSE 0 END) AS SMPL_0_to_4 
    FROM person p 
     LEFT JOIN sampletest s 
     ON p.id = s.person_id 
     LEFT JOIN examtest e 
     ON p.id = e.person_id 
GROUP BY state,gender