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)
您正在选择每一行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)
这将在单个表扫描中计算两个聚合.
归档时间: |
|
查看次数: |
1633 次 |
最近记录: |