2017-05-30 62 views
2

沿着我有2個表PostgreSQL的 - 獲得數與結果

cars 
|id|name|car_type_id| 

car_types 
|id|name| 

car_type_id可以爲車是空的。

我想查詢我的分貝,這樣我就可以得到一個汽車類型列表,其中有多少輛汽車的數量爲car_type。汽車類型爲零的汽車可以爲空。

我希望這很清楚。但任何建議是值得歡迎的。

所以我找回去像

car_type  | count 
car type 1 | 3 
car type 2 | 4 
uncategorized | 12 

編輯: 這樣我就可以使用

select 
car_type.id, 
car_type.name, 
(SELECT COUNT(*) FROM cars 
WHERE cars.car_type_id = car_type.id) as tot 
from car_type 

拿到類型和總量,而這並沒有給我所有的汽車行駛car_type_id null

+0

你到目前爲止嘗試過什麼,並且遇到了什麼問題? – jmelesky

+0

我不太清楚如何攻擊這個問題開始.... – MikeL

回答

1

使用從carscar_types的外(即left)連接,但指定'uncategorized'作爲沒有連接的car_type名稱。聯盟用反向連接過濾器匹配行。

select 
    coalesce(car_types.name, 'uncategorized') as car_type, 
    count(*) as tot 
from cars 
left join car_types on cars.car_type_id = car_types.id 
group by 1 
union 
select car_types.name, 0 
from car_types 
left join cars on cars.car_type_id = car_types.id 
where cars.car_type_id is null 
union 
select * from (select 'uncategorized', 0) 
where exists (select * from cars where car_type_id is null) 

僅供參考,coalesce()返回從提供給它的值的列表中的第一個非空值,和所有列都null在左連接表時沒有匹配的行。

+0

這一個是近乎完美的,但我也想返回0計數的car_types – MikeL

+0

完美的作品。謝謝! – MikeL

+0

我的確有問題。什麼是「1組」? – MikeL

0

可以使用UNION [ALL]兩個SELECT小號結合起來,像

SELECT 1 
UNION ALL 
SELECT 2 

產生

some_column_name 
1 
2 

所以我們可以單獨添加NULL值,像這樣

select 
car_type.id, 
car_type.name, 
(SELECT COUNT(*) FROM cars WHERE cars.car_type_id = car_type.id) as tot 
from car_type 
UNION ALL -- changes begin here, the query above is yours 
SELECT NULL, 'unknown', (COUNT (*) FROM cars WHERE car_type IS NULL); 
1

剛一個簡單的LEFT JOINGROUP BY會做到這一點:

SELECT coalesce(t.name, 'uncategorized') car_type, count(*) 
FROM cars c LEFT JOIN car_types t ON c.car_type = t.id 
GROUP BY t.id; 

    car_type | count 
---------------+------- 
uncategorized |  2 
suv   |  2 
sedan   |  3 
(3 rows)