Результат запроса столбца суммы в одном поле, а не в отдельном столбце

У меня есть запрос, который отображает свободное место в файлах данных базы данных Oracle выше верхней отметки, и в конце я хочу иметь поле, в котором будет указано "Всего" и сумма столбца "FreeSize(Мб)". Я смог сделать это только в отдельной колонке, как показано ниже:

sum( (bytes/1024/1024) - ceil( (nvl(hwm,1)* (size_db_block))/1024/1024 ) ) OVER() "Total"

Как я могу отобразить это только в одном поле? Благодарю.

SELECT 'alter database datafile '''||file_name||''' resize '|| 
    DECODE(trunc(ceil( (nvl(hwm,1)*(size_db_block))/1024/1024 ) /10),0 ,10, ceil((nvl(hwm,1)* (size_db_block))/1024/1024 )) ||'M;' "Resize Command", 
    AUTOEXTENSIBLE , bytes/1024/1024 "CurrentSize(Mb)" , 
    ((bytes/1024/1024) - ceil((nvl(hwm,1)* (size_db_block))/1024/1024)) "FreeSize(Mb)", sum((bytes/1024/1024) - ceil((nvl(hwm,1)* (size_db_block))/1024/1024)) OVER() "Total"
FROM dba_data_files a, 
    (SELECT file_id, max(block_id+blocks-1) AS hwm FROM dba_extents GROUP BY file_id) b,
    (SELECT TO_NUMBER(value) AS size_db_block FROM v$parameter WHERE name = 'db_block_size') c
WHERE a.file_id = b.file_id(+) AND AUTOEXTENSIBLE='YES' 
AND ceil(blocks*(c.size_db_block)/1024/1024)- ceil((nvl(hwm,1)*(c.size_db_block))/1024/1024 ) > 10
ORDER BY "FreeSize(Mb)";

Токовый выход:

Resize Command CurrentSize(Mb) FreeSize(Mb)      Total
------------------------------ ------------ ----------
datafile 1                 830           38        617
datafile 2                 100           65        617
datafile 3                 100           80        617
datafile 4                 100           80        617
datafile 5                 390          354        617

Но я хочу, чтобы это отображалось:

Resize Command CurrentSize(Mb) FreeSize(Mb)
------------------------------ ------------
datafile 1                 830           38
datafile 2                 100           65
datafile 3                 100           80
datafile 4                 100           80
datafile 5                 390          354
                               Total:   617

1 ответ

Решение

То, что вы добавили в качестве вывода, невозможно в терминах RDBMS. Вам нужен инструмент отчетности для отображения в этом формате. Если вы просто хотите отобразить в инструменте (SQL+ или жаба), вы можете добавить дополнительную строку к выводу, которая будет содержать суммированное значение для свободного размера (Total Free Size).

SELECT 'alter database datafile '''||file_name||''' resize '|| 
    DECODE(trunc(ceil( (nvl(hwm,1)*(size_db_block))/1024/1024 ) /10),0 ,10, ceil((nvl(hwm,1)* (size_db_block))/1024/1024 )) ||'M;' "Resize Command", 
    AUTOEXTENSIBLE , bytes/1024/1024 "CurrentSize(Mb)" , 
    ((bytes/1024/1024) - ceil((nvl(hwm,1)* (size_db_block))/1024/1024)) "FreeSize(Mb)"

FROM dba_data_files a, 
    (SELECT file_id, max(block_id+blocks-1) AS hwm FROM dba_extents GROUP BY file_id) b,
    (SELECT TO_NUMBER(value) AS size_db_block FROM v$parameter WHERE name = 'db_block_size') c
WHERE a.file_id = b.file_id(+) AND AUTOEXTENSIBLE='YES' 
AND ceil(blocks*(c.size_db_block)/1024/1024)- ceil((nvl(hwm,1)*(c.size_db_block))/1024/1024 ) > 10
ORDER BY "FreeSize(Mb)"

UNION 


SELECT 'Total Free Size', AUTOEXTENSIBLE ,
    '', 
    sum((bytes/1024/1024) - ceil((nvl(hwm,1)* (size_db_block))/1024/1024)) OVER() "Total"
FROM dba_data_files a, 
    (SELECT file_id, max(block_id+blocks-1) AS hwm FROM dba_extents GROUP BY file_id) b,
    (SELECT TO_NUMBER(value) AS size_db_block FROM v$parameter WHERE name = 'db_block_size') c
WHERE a.file_id = b.file_id(+) AND AUTOEXTENSIBLE='YES' 
AND ceil(blocks*(c.size_db_block)/1024/1024)- ceil((nvl(hwm,1)*(c.size_db_block))/1024/1024 ) > 10
ORDER BY "FreeSize(Mb)";
Другие вопросы по тегам