Я хочу сгруппировать результаты запроса 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);
