具有以下字段的用户表。
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/