Sql 单列求和,不是单组函数

Sql 单列求和,不是单组函数,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我想知道为什么在这个查询中: SELECT 100 * (select sum(s.bytes) from dba_segments s where TABLESPACE_NAME='USERS') / sum(MAXBYTES) used FROM dba_data_files WHERE tablespace_name = 'USERS' 我要走了 没有一个组函数错误 我可以通过在末尾添加groupbytablespace\u

我想知道为什么在这个查询中:

SELECT 100 * (select sum(s.bytes)
                from dba_segments s
                where TABLESPACE_NAME='USERS') / sum(MAXBYTES) used
FROM dba_data_files
WHERE tablespace_name = 'USERS'
我要走了

没有一个组函数错误

我可以通过在末尾添加
groupbytablespace\u name
来修复它,但我不明白为什么需要它

还尝试了将subselect放入MAX中,但错误更改为

缺失表达

编辑:

预期结果:0和100之间的小数点为1。(4.43725586,结果如下) 我想将两个查询的结果除以100

获取实际大小的第一个查询:

select sum(s.bytes)
from dba_segments s
where TABLESPACE_NAME='USERS'
结果:524091392

获取最大大小的第二个查询:

select sum(MAXBYTES)
FROM dba_data_files
WHERE tablespace_name = 'USERS'

结果:1.1811E+10

,因为您的子选择就像您的第一列没有聚合结果一样 试用

SELECT 100 * ( select sum(s.bytes) 
from dba_segments s 
where TABLESPACE_NAME='USERS')  / sum(MAXBYTES) used
FROM dba_data_files
WHERE tablespace_name = 'USERS'
group by 100 * ( select sum(s.bytes) 
from dba_segments s 
where TABLESPACE_NAME='USERS') 

我将在两个派生表之间使用联接:

select 100 * (s.used_bytes / df.maxbytes) as used_pct
from (
  select tablespace_name, sum(maxbytes) as maxbytes
  from dba_data_files 
  group by tablespace_name
) df
  join (
    select tablespace_name, sum(bytes) as used_bytes
    from dba_segments 
    group by tablespace_name
  ) s on s.tablespace_name = df.tablespace_name
where s.tablespace_name = 'USERS';

当使用像这样的嵌入式子选择时,Oracle无法理解您是在为单个表空间提取数据,并坚持要求为您提供一个
分组

如果将查询更改为使用联接,并且表空间名称在
WHERE
子句中给出,则可以避免使用
GROUP BY

SELECT 100 * COALESCE(SUM(s.BYTES), SUM(f.BYTES))
         / COALESCE(NULLIF(SUM(f.MAXBYTES), 0), NULLIF(SUM(f.BYTES), 0)) used
  FROM DBA_DATA_FILES f
  LEFT OUTER JOIN DBA_SEGMENTS s
    ON s.TABLESPACE_NAME = f.TABLESPACE_NAME
  WHERE f.TABLESPACE_NAME = 'USERS'
我修改了初始查询以处理
SUM(f.MAXBYTES)
变为零的问题,这在我的系统上会发生,导致“除数为零”错误


祝你好运。

我认为这是Oracle中的一个解析错误。以下操作失败,并显示相同的消息:

SELECT 100 * (select sum(s.bytes)
              from dba_segments s
             ) / sum(df.MAXBYTES) as used
FROM dba_data_files df
WHERE df.tablespace_name = 'USERS';
但是,这解决了问题:

SELECT 100 * (select sum(s.bytes)
                from dba_segments s
                where s.TABLESPACE_NAME = 'USERS'
             ) / sum(df.MAXBYTES) as used
FROM dba_data_files df
WHERE df.tablespace_name = 'USERS'
GROUP BY 'a';  -- a constant here
子查询是不相关的,因此应该允许它。但是,Oracle似乎不允许在没有
GROUP BY
的版本中使用它

至于解决方案,我倾向于将两个子查询移动到
FROM
子句:

SELECT (100 * segment_bytes / df_bytes) as used
FROM (select sum(df.MAXBYTES) as df_bytes
      from dba_data_files df
      where df.TABLESPACE_NAME = 'USERS'
     ) df CROSS JOIN
     (select sum(s.bytes) as segment_bytes
      from dba_segments s
      where s.TABLESPACE_NAME = 'USERS'
     ) s;

提供样本数据和期望的结果。感谢您的回答,为什么必须有关于零的分组信息。但是您的查询和重复(或类似的情况),因此结果是错误的。我最后用了一个没有名字的@a_horse_。但我不知道我现在应该标记哪个答案。为什么交叉连接?那么你就不需要附加条件了?@Tundy。因为在这种情况下,
交叉联接
是合适的,因为两个子查询都只返回一行。