2017-08-14 1 views
2

Ich arbeite in Postgres 9.6. Ich habe eine Tabelle von Vermögenswerten:Postgres: Gruppieren nach und zählen mit Join über Tabellen?

CREATE TABLE assets (
    name varchar, 
    company_number varchar 
); 

und eine Tabelle der Unternehmen (die company_number in den beiden Feldern ist verwandt, obwohl es keine formelle Fremdschlüssel ist) - ein Unternehmen kann viele Vermögenswerte haben:

CREATE TABLE companies (
    company_number varchar primary key, 
    name varchar 
); 

und eine Tabelle der Unternehmensleiter, mit einem Fremdschlüssel für Unternehmen - ein Unternehmen kann viele Regisseure haben:

CREATE TABLE directors (
    id serial primary key, 
    company_number varchar REFERENCES companies(company_number), 
    person_name varchar 
); 

ich in den mos eine Rangliste von denen die Direktoren bekommen beteiligt sind t Unternehmen einfach, wie folgt:

SELECT person_name, count(*) AS num_companies 
    FROM directors 
    GROUP BY person_name 
    ORDER BY num_companies DESC; 

Und ich kann eine Rangliste der Anzahl der Vermögenswerte von jedem Direktor im Besitz erhalten wie folgt (I denke, das ist richtig):

SELECT q.person_name, count(*) as num_assets FROM 
(SELECT a.name, c.company_number, c.person_name AS person_name 
    FROM directors d 
    LEFT JOIN assets a 
    ON a.company_number=d.company_number) q 
GROUP BY q.person_name ORDER by num_assets DESC; 

Aber Wie würde ich beides in einem Befehl bekommen? Mit anderen Worten, ich hätte gerne eine vollständige Liste der Direktoren, sowohl mit der Anzahl der Unternehmen, an denen sie beteiligt sind, als auch mit der Anzahl der Vermögenswerte, die diese Unternehmen kontrollieren.

UPDATE: wie gewünscht, hier ist beispielsweise SQL für die Tabellen und Daten zu erstellen:

CREATE TABLE assets (
    name varchar, 
    company_number varchar 
); 
INSERT INTO assets VALUES ('foo', 1), ('bar', 1), ('baz', 2), ('bar', 2), ('fii', 3); 
CREATE TABLE companies (
    company_number varchar primary key, 
    name varchar 
); 
INSERT INTO companies VALUES (1, 'acme corp'), (2, 'intergalactic holdings inc'), (3, 'intergalactic shellco inc'); 
CREATE TABLE directors (
    id serial primary key, 
    company_number varchar REFERENCES companies(company_number), 
    person_name varchar 
); 
INSERT INTO directors(company_number, person_name) VALUES (1, 'arthur dent'), (1, 'trillian'), (2, 'ford prefect'), (3, 'ford prefect'); 

Und das sind die Ergebnisse, die ich erhalten möchte:

person_name,num_companies,num_assets 
ford prefect,2,3 
arthur dent,1,2 
trillian,1,2 
+1

Bitte erstellen Datenabtastwert http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=765222fd826584bac50716f974ebecef und Post gewünschte Ausgabe – lad2025

+0

@ lad2025 dank Verwendung von I kämpfte ein bisschen mit dieser Seite (kann nicht herausfinden, wie man den Zustand in einer Geige löscht oder eine neue Geige bearbeitet!), aber ein Update gepostet hat. – Richard

Antwort

1

Ich würde wie eine vollständige Liste der Direktoren, mit der Anzahl der Unternehmen, an denen sie beteiligt sind, und der Anzahl der Vermögenswerte, die diese Unternehmen kontrollieren

Wenn ich richtig verstehe, müssen Sie etwas wie folgt aus:

select directors.person_name, count(distinct directors.company_number) as company_count, count(distinct name) as asset_count 
from directors 
join assets 
on directors.company_number = assets.company_number 
group by directors.person_name; 
Verwandte Themen