带有子句的sql问题

时间:2015-08-21 21:13:39

标签: sql oracle group-by having ora-00979

我试图用最常用的ram配置查找每个模型。

表:

PC (code, model, speed, ram, hd, cd, price)

到目前为止,我能够列出每个ram配置的每个模型以及ram配置的使用次数。

select model, ram, max(config)
  from (select model,ram,count(ram) as config
          from pc 
         group by model, ram)
 group by model, ram

输出:

MODEL   RAM  MAX(CONFIG)
------- ---- -----------
1232    64   2
1232    32   2
1233    128  3
1121    128  3
1233    64   1
1260    32   1

当我尝试使用最常用的ram列出模型时,我遇到了问题。

select model, ram
  from (select model, ram, count(ram) as config
          from pc 
         group by model, ram)
 group by model
having config = max(config);


Error : ORA-00979: not a GROUP BY expression

3 个答案:

答案 0 :(得分:0)

with x as 
(select model,ram,count(ram) as config
from pc 
group by model,ram)
, y as 
(select model, max(config) as mxconfig from x group by model)
select x.model, x.ram --choose max(x.ram) or min(x.ram) in case of a tie and group by x.model
from x join y on x.model = y.model and x.config = y.mxconfig

此解决方案使用cte来实现您的需求。如果您需要获得maxmin ram,那么您需要在模型上有一个group by

答案 1 :(得分:0)

我认为你在寻找的是:

SELECT model,ram FROM (SELECT model,ram,count(ram) AS config
FROM pc 
GROUP BY model,ram)
WHERE config=max(config)

记录应该已经按子查询分组

答案 2 :(得分:0)

一种方法是使用窗口函数:

select model, ram
from (select model, ram,
             row_number() over (partition by model order by count(*) desc) as seqnum
      from pc 
      group by model, ram
     ) mr
where seqnum = 1;