gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:29:04 25 4
gpt4 key购买 nike

我想将 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 in a nutshell (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);

最佳答案

您从 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

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

关于sql - 为什么 count(*) 在此子查询 (postgresql) 中返回多个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com