2
我正在Postgres 9.6工作。我有資產表:Postgres:通過表計算並加入計數?
CREATE TABLE assets (
name varchar,
company_number varchar
);
和公司的一個表(在這兩個領域的company_number
不無關係,雖然沒有正式的外鍵) - 一個公司可以有很多資產:
CREATE TABLE companies (
company_number varchar primary key,
name varchar
);
而公司董事的表,與外國關鍵公司 - 一個公司可以有很多導演:
CREATE TABLE directors (
id serial primary key,
company_number varchar REFERENCES companies(company_number),
person_name varchar
);
我可以得到一個排名列表,其中董事都參與了MOS牛逼企業根本,如下:
SELECT person_name, count(*) AS num_companies
FROM directors
GROUP BY person_name
ORDER BY num_companies DESC;
,我還可以如下得到各董事所擁有的資產數量的排名列表(我認爲這是正確的):
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;
但我怎麼會在一個命令中獲得兩個?換句話說,我想要一份完整的董事名單,包括他們參與的公司數量以及這些公司控制的資產數量。
更新:根據要求,這裏的例子SQL創建表和數據:
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');
這些都是我想要得到的結果:
person_name,num_companies,num_assets
ford prefect,2,3
arthur dent,1,2
trillian,1,2
使用http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=765222fd826584bac50716f974ebecef和崗位所需的輸出 – lad2025
@ lad2025感謝請創建示例數據,我與該網站掙扎了一下(無法弄清楚如何清除小提琴中的狀態,或編輯新的小提琴!),但已發佈更新。 – Richard