The below SQL reports on the space usage by table space along with details on each data file. Additionally, it identifies if a physical standby exists.
SELECT
(
select case when count(*) > 0 then 'Standby exists'
else 'No standby'
end
from gv$parameter
where lower(name) like 'log_archive_dest_%'
and not lower(name) like '%_state_%'
and not lower(display_value) like 'location=%'
and not value is null
) AS "STANDBY_STATUS"
,'TABLE SPACE' AS "OBJECT_TYPE"
,DF.TABLESPACE_NAME AS "OBJECT_NAME"
,df.AUTOEXTENSIBLE AS "AUTO_EXTEND"
,' ' AS "file_name"
,0 AS "FILE_ID"
,ROUND(SUM((DF.BYTES/1024)/1024),2) AS "MB_ALLOC"
,ROUND(SUM((FS.FREE_BYTES/1024)/1024),2) AS "MB_FREE"
,ROUND(((SUM(FS.FREE_BYTES)/SUM(DF.BYTES)) * 100),2) AS "PCT_FREE"
,case
when ROUND(((SUM(FS.FREE_BYTES)/SUM(DF.BYTES)) * 100),2) < 10 then '<--Problem'
else ' '
end as "Check_flag"
,'B' AS "SORT_COL_01"
FROM DBA_DATA_FILES DF
left outer JOIN (SELECT FILE_ID
,SUM(BYTES) AS FREE_BYTES
FROM DBA_FREE_SPACE
GROUP BY FILE_ID) FS
ON DF.FILE_ID = FS.FILE_ID
GROUP BY DF.TABLESPACE_NAME
,df.AUTOEXTENSIBLE
UNION ALL
SELECT
' '
,'FILE '
,DF.TABLESPACE_NAME
,' '
,DF.FILE_NAME
,DF.FILE_ID
,round(((DF.BYTES/1024)/1024),2)
,round(((FS.FREE_BYTES/1024)/1024),2)
,round(((FS.FREE_BYTES/DF.BYTES) * 100),2)
,' '
,'C'
FROM DBA_DATA_FILES DF
left outer JOIN (SELECT FILE_ID
,SUM(BYTES) AS FREE_BYTES
FROM DBA_FREE_SPACE
GROUP BY FILE_ID) FS
ON DF.FILE_ID = FS.FILE_ID
ORDER BY OBJECT_NAME
,SORT_COL_01
,"FILE_ID"
;