我想将 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);