Postgresql - 获得计数和结果

时间:2017-05-30 22:47:23

标签: postgresql count aggregate-functions knex.js

我有2张桌子

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

的汽车

3 个答案:

答案 0 :(得分:1)

使用从carscar_types的外部(即'uncategorized')加入,但指定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) 作为没有加入的car_type名称。使用反向连接过滤 out 匹配行的联盟。

coalesce()

fyi,null从提供给它的值列表中返回第一个非空值,并且当没有匹配的行时,左连接表中的所有列都是coder

答案 1 :(得分: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)

答案 2 :(得分:0)

您可以使用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); 值,如此

window.onload = function(){

  var refFile = "./myFile"; // path to my txt file
  var fileContent;

  $.get(refFile, function(response) {
    // do something here
  }).done(function(response){
    fileContent = response;
  });

  alert(fileContent); // not undefined anymore

}