2010-11-18 30 views
0

Ich möchte Ergebnisse von zwei Tabellen nach gleichen Regeln gruppiert zusammen in einer Auswahl erhalten.Join Ergebnisse von zwei SQL-Tabellen

Ich habe Tabelle 1

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

Tabelle 2

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

Tabelle 3

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

Ich möchte diese Ausgabe durch staatliche

Gruppe erhalten | Gruppe nach Geschlecht | zählen (Prüfungsergebnis> 0) | count (Ergebnis> 0 und führen < 4)

ich so etwas wie dieses

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 

versucht, aber ich Ergebnisse, die voneinander abhängig sind. Wie bekomme ich unabhängige Ergebnisse in eine Auswahl?

Antwort

0

Build-Unter wählt

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

könnten Sie ein bisschen mehr helfen, ich zählen brauchen 0 für Staaten, Geschlechter, die von 0,1,2,3,4 gruppiert haben e.examresult Dont , 5 – damir

+0

Korrelierte Unterabfragen sind aus Performanceperspektive eine schlechte Lösung. Dies sollte niemals Ihre erste Wahl sein. – HLGEM

+0

Ich schreibe Abfragen wie diese, manchmal Hunderte von Zeilen lang, und sie übertreffen in der Regel andere Lösungen. Dies hängt wahrscheinlich von der verwendeten Datenbank ab. Bei Verwendung von Oracle gilt als Faustregel: Je schlechter die Abfrage aussieht, desto besser ist sie in der Regel. Aber die linke Verbindung in der anderen Antwort wird wahrscheinlich gut und vielleicht sogar besser funktionieren. – GolezTrol

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