SELECT a.tablespace_name, b.tot_size as Size_MB, NVL(d.tot_size,0) as Free_MB,
round(NVL(d.tot_size,0)/b.tot_size*100,2) as Free_Per, a.status
FROM DBA_TABLESPACES a,
( SELECT tablespace_name, count(*) as file_cnt, Round(Sum(bytes)/1024/1024) as tot_size
FROM DBA_DATA_FILES
GROUP BY tablespace_name
UNION ALL
SELECT tablespace_name, count(*) as file_cnt, Round(Sum(bytes)/1024/1024) as tot_size
FROM DBA_TEMP_FILES
GROUP BY tablespace_name ) b,
( SELECT tablespace_name, count(*) as free_cnt, Round(Sum(bytes)/1024/1024) as tot_size, Max(bytes) as max_size
FROM DBA_FREE_SPACE
GROUP BY tablespace_name ) d
WHERE b.tablespace_name = a.tablespace_name
AND d.tablespace_name(+) = a.tablespace_name
ORDER BY a.tablespace_name