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。因为在这种情况下,交叉联接
是合适的,因为两个子查询都只返回一行。