2016-04-27 10 views
0

Hier ist die Situation:zählt, wie oft ein Wert in Tabellen dargestellt wird SQL

in meiner Datenbank So eine Person ist „verantwortlich“ für Job X und „verknüpft“ Job Y. Was ich will, ist eine Abfrage das gibt zurück: Name der Person, seine ID und die Anzahl der Jobs, für die er/sie verantwortlich ist. Bisher habe ich diese:

select id_job, count(id_job) number_jobs 
from 
(
select responsible.id 
from responsible 
union all 
select linked.id 
from linked 
GROUP BY id 
) id_job 
GROUP BY id_job 

Und es gibt eine Tabelle mit der ID in der ersten Spalte und die Anzahl der Vorkommen in den zweiten. Nun, was ich nicht tun kann ist, den Namen der Person mit dem Tisch zu verbinden. Wenn ich das von Anfang an in die "Auswahl" lege, gibt es mir alle möglichen Kombinationen ... Wie kann ich das lösen? Danke im Voraus!

Beispieldaten und wünschenswert Ausgabe:

| Person | 

id | name 
1 | John 
2 | Francis 
3 | Chuck 
4 | Anthony 

| Responsible | 

process_no | id 
100  | 2 
200  | 2 
300  | 1 
400  | 4 

| Linked | 

process_no | id 
101  | 4 
201  | 1 
301  | 1 
401  | 2 

OUTPUT: 

| OUTPUT | 

id | name | number_jobs 
1 | John | 3 
2 | Francis | 3 
3 | Chuck | 0 
4 | Anthony | 2 
+2

Bitte fügen Sie Daten Beispiel und Ausgangs –

+0

Ok erwartet, wird jetzt tun – Username79123

Antwort

0

Versuchen Sie, diese Art und Weise

select prs.id, prs.name, count(*) from Person prs 
join(select process_no, id 
    from Responsible res 
    Union all 
    select process_no, id 
    from Linked lin) a on a.id=prs.id 
group by prs.id, prs.name 
0
select id, name, count(process_no) FROM (
    select pr.id, pr.name, res.process_no from Person pr 
     LEFT JOIN Responsible res on pr.id = res.id 
UNION 
    select pr.id, pr.name, lin.process_no from Person pr 
     LEFT JOIN Linked lin on pr.id = lin.id) src 
group by id, name 
order by id 

Abfrage nicht geprüft wird, geben Sie ihm einen Schuss, aber das ist die Art und Weise Sie

+0

ich es versucht, aber es produziert und leeren Tisch ... Was könnte schief gehen? – Username79123

+0

Ich benutzte temporäre Tabellen ... entferne '#' von Tabellennamen – Veljko89

0

ich empfehlen würde aggregieren jeweils hinwollen die Tabellen von der Person und dann die Ergebnisse zurück an den person Tisch verbindet:

select p.*, coalesce(r.cnt, 0) + coalesce(l.cnt, 0) as numjobs 
from person p left join 
    (select id, count(*) as cnt 
     from responsible 
     group by id 
    ) r 
    on r.id = p.id left join 
    (select id, count(*) as cnt 
     from linked 
     group by id 
    ) l 
    on l.id = p.id; 
Verwandte Themen