Postgresql - 获取计数和结果
Postgresql - get counts along with results
我有2张桌子
cars
|id|name|car_type_id|
car_types
|id|name|
car_type_id
对于汽车可以为空。
我想查询我的数据库,这样我就可以得到一个汽车类型列表,其中包含每个 car_type
的汽车数量。 car type为null的车可以为null
我希望这是清楚的。但欢迎任何建议。
所以我想找回像
这样的东西
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
的车
使用从 cars
到 car_types
的外部(即 left
)连接,但在没有连接的地方指定 'uncategorized'
作为 car_type 名称.将其与反向连接合并,过滤 out 匹配行。
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)
fyi,coalesce()
returns 提供给它的值列表中的第一个非空值,并且所有列都是 null
左连接 table 当没有匹配的行时。
您可以使用 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);
只需一个简单的 LEFT JOIN
和 GROUP 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)
我有2张桌子
cars
|id|name|car_type_id|
car_types
|id|name|
car_type_id
对于汽车可以为空。
我想查询我的数据库,这样我就可以得到一个汽车类型列表,其中包含每个 car_type
的汽车数量。 car type为null的车可以为null
我希望这是清楚的。但欢迎任何建议。
所以我想找回像
这样的东西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
的车使用从 cars
到 car_types
的外部(即 left
)连接,但在没有连接的地方指定 'uncategorized'
作为 car_type 名称.将其与反向连接合并,过滤 out 匹配行。
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)
fyi,coalesce()
returns 提供给它的值列表中的第一个非空值,并且所有列都是 null
左连接 table 当没有匹配的行时。
您可以使用 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);
只需一个简单的 LEFT JOIN
和 GROUP 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)