2017-03-15 2 views
0

Ich habe die folgenden Tabellen:SQL - Count Einträge aus mehreren Tabellen

Table A: 
+--------+ 
| name | 
+--------+ 
| name1 | 
| name2 | 
| name3 | 
+--------+ 

Table B: 
+--------+----------+ 
| name | someB | 
+--------+----------+ 
| name1 | dorem | 
| name1 | lorem | 
| name3 | ipsum | 
+--------+----------+ 

Table C: 
+--------+----------+ 
| name | someC | 
+--------+----------+ 
| name1 | dorem | 
| name2 | lorem | 
| name2 | ipsum | 
+--------+----------+ 

Wie würde die SQL aussehen wie die Einträge aus den beiden unteren Tabellen für jeden Namen zu zählen?

Das Ergebnis sollte wie folgt aussehen:

+--------+----+----+ 
| name | A | B | 
+--------+----+----+ 
| name1 | 2 | 1 | 
| name2 | 0 | 2 | 
| name3 | 1 | 0 | 
+--------+----+----+ 

Antwort

1

können Sie korrelierte Unterabfragen in der SELECT-Klausel verwenden:

select name, 
    (select count(*) from table2 t2 where t2.name = t1.name) as A, 
    (select count(*) from table3 t3 where t3.name = t1.name) as B 
from table1 t1 
1

Erstens haben Sie ein Problem mit der Datenstruktur. Wenn die erste Tabelle eindeutige IDs für die Namen hat, sollte dies in den nachfolgenden Tabellen verwendet werden. In jedem Fall haben Sie name in beiden Tabellen, in denen Sie die Zählungen durchführen möchten. Sie können union all und group by verwenden:

select name, sum(a) as a, sum(b) as b 
from ((select name, 1 as a, 0 as b from t2) union all 
     (select name, 0, 1 from t3) 
    ) t 
group by name; 
+0

Für einen Anfänger, die Beschreibung Denormalisierung wird nicht sehr zwingend sein. Darf ich Ihnen eine detailliertere Beschreibung dessen geben, was Sie meinen, indem Sie eindeutige IDs in nachfolgenden Tabellen verwenden, und warum ist das wichtig, was sind die Fallstricke, wenn Sie das nicht tun? – ErikE

0

starten:

SELECT C.name, COUNT(A.name),  COUNT(B.Name) 
    FROM C 
    LEFT JOIN A ON C.name = A.name 
    LEFT JOIN B ON C.name = B.name 
    GROUP BY C.name 
0
select A.Name, B2.Nb as A, C2.Nb as B 

from A 

inner join lateral 
(
select count(*) Nb from B where B.Name=A.Name 
) B2 on 1=1 

inner join lateral 
(
select count(*) Nb from C where C.Name=A.Name 
) C2 on 1=1