[英]PostgreSQL: count occurrence of true values in columns
我有下表:
CREATE TABLE trips(
trip_id int,
true_foot boolean,
true_bike boolean,
true_bus boolean,
true_car boolean,
true_metro boolean
)
INSERT INTO trips (trip_id,true_foot,true_bike,true_bus,true_car,true_metro)
VALUES
(563097,'t','f','f','f','f'),
(596303,'f','f','f','t','f'),
(595648,'f','f','f','t','f'),
(566061,'t','f','f','f','f'),
(566753,'t','f','f','f','f'),
(561179,'t','f','f','f','f'),
(535519,'f','f','f','f','f'),
(548460,'t','f','f','f','f'),
(543477,'f','f','f','t','f'),
(540797,'t','f','f','f','f')
一行中只有一列具有真值(或没有)。 然后我想计算步行、自行车、公共汽车等的所有真实值......
SELECT
COUNT(*) FILTER (WHERE true_foot IS TRUE ) AS 'walk',
COUNT(*) FILTER (WHERE true_bike IS TRUE ) AS 'bike',
COUNT(*) FILTER (WHERE true_bus IS TRUE) AS 'bus',
COUNT(*) FILTER (WHERE true_car IS TRUE) AS 'car',
COUNT(*) FILTER (WHERE true_metro IS TRUE) AS 'metro'
FROM trips
ERROR: syntax error at or near "'walk'"
LINE 3: COUNT(*) FILTER (WHERE true_foot IS TRUE ) AS 'walk',
单引号只能用于字符串和日期常量。 你不需要它们,所以删除它们。
还有, is true
其实是多余的。 所以:
SELECT COUNT(*) FILTER (WHERE true_foot) AS walk,
COUNT(*) FILTER (WHERE true_bike) AS bike,
COUNT(*) FILTER (WHERE true_bus) AS bus,
COUNT(*) FILTER (WHERE true_car) AS car,
COUNT(*) FILTER (WHERE true_metro) AS metro
FROM trips;
我喜欢为此使用SUM()
。 您只需要将布尔值转换为 integer 值( true
变为1
, false
变为0
)。
SELECT
SUM( (true_food)::int ) AS walk,
SUM( (true_bike)::int ) AS bike,
SUM( (true_bus)::int ) AS bus,
SUM( (true_car)::int ) AS car,
SUM( (true_metro)::int ) AS metro
FROM trips
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.