sql - 选择具有不同条件的多列

标签 sql postgresql select count

具有以下字段的用户表。

id
agent_id
locality
total
building_type
price

我通过以下查询得到不同的统计结果

SELECT agent_id, COUNT(*) AS stat_1 
FROM users 
WHERE "building_type" = 'single' 
AND ("price" BETWEEN 0 AND 200000) 
GROUP BY "agent_id" 
order by agent_id

SELECT agent_id, COUNT(*) AS stat_2 
FROM users 
WHERE "building_type" = 'single' 
AND ("price" BETWEEN 200001 AND 350000) 
GROUP BY "agent_id" 
order by agent_id

SELECT agent_id, COUNT(*) AS stat_3 
FROM users 
WHERE "building_type" = 'single' 
AND ("price" BETWEEN 3500001 AND 500000) 
GROUP BY "agent_id" 
order by agent_id

但我想在所有统计信息的相同查询中获得结果,例如

SELECT agent_id, 
       COUNT(*) AS stat_1, 
       COUNT(*) AS stat_2, 
       COUNT(*) AS stat_3 
from users 
where <Conditions>

如何在一个查询中得到这个结果?

最佳答案

Postgres 9.4 以优雅的方式解决了这类问题,添加了一个 filter 子句,允许您在聚合函数上应用条件:

SELECT   agent_id, 
         COUNT(*) FILTER (WHERE "price" BETWEEN 0 AND 200000) AS stat_1,
         COUNT(*) FILTER (WHERE "price" BETWEEN 200001 AND 350000) AS stat_2,
         COUNT(*) FILTER (WHERE "price" BETWEEN 3500001 AND 500000) AS stat_3
FROM     users 
WHERE    "building_type" = 'single' 
GROUP BY "agent_id" 
ORDER BY "agent_id"

对于不允许 filter 子句的早期版本,您可以通过将聚合函数应用于 case 表达式来自己实现相同的行为。在这里,我们利用 count 忽略 null 的属性:

SELECT   agent_id, 
         COUNT(CASE WHEN "price" BETWEEN 0 AND 200000 THEN 1 END) AS stat_1,
         COUNT(CASE WHEN "price" BETWEEN 200001 AND 350000 THEN 1 END) AS stat_2,
         COUNT(CASE WHEN "price" BETWEEN 3500001 AND 500000 THEN 1 END) AS stat_3
FROM     users 
WHERE    "building_type" = 'single' 
GROUP BY "agent_id" 
ORDER BY "agent_id"

关于sql - 选择具有不同条件的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38736105/

相关文章:

SQL Server INSERT 触发器如何获取当前行的数据

reactjs - react |多个动态选择框的单个onchange方法

mysql - 如何从 mySql 中的 EXECUTE 语句插入数据?

sql - 从默认约束中获取值

mysql 根据值显示列

postgresql - 在 AWS Amazon Linux (EC2) AMI 上安装 PostgreSQL Client v10

php - 如何使用 PHP 脚本将 postgres 数据库备份到 sql 文件?

"date $1"参数化查询中的 PostgreSQL 语法错误

MySQL:选择问题

php - 在 PostgreSQL 中用单引号插入值