Я хочу сгруппировать результаты запроса 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;
ИЗМЕНИТЬ Ответ Andomar также позволил мне найти следующий подход (адаптированный из примера в SQL в двух словах (O'Reilly)). Это позволяет мне иметь ведра в одном столбце, с строкой для каждого спайка/ответа. Я думал, что включу его для кого-нибудь с этим прецедентом:
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);