为什么count(*)在这个子查询(postgresql)中返回多个结果?

cms*_*mgr 1 sql postgresql postgresql-9.1

我想将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;
Run Code Online (Sandbox Code Playgroud)

编辑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);
Run Code Online (Sandbox Code Playgroud)

And*_*mar 6

您正在选择每一行orders,然后为每一行评估子查询.

请考虑这种方法:

select  count(case when 0 < totalamount and totalamount <= 100 then 1 end)
            as "<0,100]"
,       count(case when 100 < totalamount and totalamount <= 200 then 1 end)
            as "<100,200]"
from    Orders
Run Code Online (Sandbox Code Playgroud)

这将在单个表扫描中计算两个聚合.