Я хочу сгруппировать результаты запроса count(*) в сегменты значений. Я тестирую это на примере базы данных dellstore2 postgresql. Мой запрос ниже возвращает правильные ответы, но делает это один раз для каждой строки в таблице (несколько тысяч одинаковых результатов). Я могу исправить это, добавив LIMIT 1
в конец запроса, но я хотел бы понять, почему я получаю дубликаты, если это указывает на более широкую проблему с моим подходом. Запрос:
SELECT
(SELECT count(*)
FROM
orders
WHERE
totalamount > 0 AND totalamount <= 100) AS ">0 <= 100",
(SELECT count(*)
FROM
orders
WHERE
totalamount > 100 AND totalamount <= 200) AS ">100 <= 200"
...
FROM
orders;
РЕДАКТИРОВАТЬ Ответ Андомара также позволил мне найти следующий подход (адаптированный из примера в SQL в двух словах (О'Рейли)). Это позволяет мне иметь сегменты в одном столбце со строкой для каждой пары сегмент/ответ. Я подумал, что включу его для всех, у кого есть такой вариант использования:
SELECT CASE
WHEN totalamount IS NULL THEN 'Unknown'
WHEN totalamount <= 100 THEN 'Not more than 100'
WHEN totalamount <= 200 THEN 'Not more than 200'
ELSE 'Over 200'
END "Bucket",
COUNT(*) "Number of results"
FROM
orders
GROUP BY CASE
WHEN totalamount IS NULL THEN 'Unknown'
WHEN totalamount <= 100 THEN 'Not more than 100'
WHEN totalamount <= 200 THEN 'Not more than 200'
ELSE 'Over 200'
END
ORDER BY
MIN(totalamount);