gpt4 book ai didi

oracle - 组合 Group BY 和每个结果的多个计数

转载 作者:行者123 更新时间:2023-12-02 01:26:27 27 4
gpt4 key购买 nike

我是 Oracle 的新手,希望结果包含基于值的多个计数。例如:

SELECT p.name, count(f.id) as eaten_apples, count(f.id) as eaten_oranges
FROM food f, people p
WHERE f.pid=p.pid
AND f.id = 'apple' OR f.id = 'orange'
GROUP BY p.name;

显然,在那里使用 count(f.id) 两次每次都会产生相同的结果,但我们希望对所吃的每种食物进行一次计数。苹果和橙子。预期结果可能如下所示:

[0] => 
name : john
eaten_apples: 3
eaten_oranges: 1
[1] =>
name : sam
eaten_apples: 0
eaten_oranges: 9
...

换句话说,每个结果有多个计数。在这种情况下,一个人吃的食物数量。

我的查询现在为每个名称返回两个结果,我可以在 SQL 之外组合它们,但我希望从 SQL 结果中为每个名称返回一个结果。

最佳答案

在 Oracle 中不习惯像这样分组,但如果需要,仍然可以这样做。相反,更好的做法和我的建议是按 nameid 分组,产生两行,每个水果一行。

SELECT p.name, f.id, count(1) as eaten_fruit
from food f, people p
WHERE f.pid=p.pid
AND (
f.id = 'apple' OR
f.id = 'orange'
)
GROUP BY p.name, f.id;

我相信让应用程序处理上面数据的读取效率更高,但正如我所指出的,有重新格式化的选项。存在a number of ways to transpose these row based results into columns另一个解决方案尝试其中之一。我的首选方法是使用 PIVOT operator这是专门为此目的而引入的。要以您想要的格式获得结果,您可以将行转置为列:

select name, id from
(
select p.name, f.id
from food f, people p
where f.pid = p.pid
and f.id in ('apple','orange')
)
pivot (
count(id)
for id in (
'apple' as eaten_apples,
'orange' as eaten_oranges
)
);

它会起作用,但不是习惯。

关于oracle - 组合 Group BY 和每个结果的多个计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853540/

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