2016-08-03 5 views
3

Таблица пользователей со следующими полями.выберите несколько столбцов с различным состоянием

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> 

Как я могу получить этот результат в один запрос?

ответ

3

Вы можете использовать условное агрегацию:

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 
+0

Спасибо за ответ. Меня устраивает. –

3

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, вы можете реализовать одно и то же поведение, применив функцию aggregate к выражению case. Здесь мы используем свойство count «s игнорирования null S:

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" 
+0

Спасибо за ваш ответ. Я думаю, что ваш ответ тоже прав, но для моего требования только предложение фильтра работает. –

Смежные вопросы