Как выбрать количество в процентах от общего числа в Oracle, используя любую функцию Oracle? - PullRequest
3 голосов
/ 07 июля 2011

У меня есть оператор SQL, который считает общее количество строк активных пакетов, конечная дата которых равна нулю. В настоящее время я делаю это, используя (x/y) * 100:

SELECT (SELECT COUNT(*) 
          FROM packages 
         WHERE end_dt IS NULL) / (SELECT COUNT(*) 
                                    FROM packages) * 100 
  FROM DUAL;

Интересно, есть ли способ использовать какую-либо функцию Oracle для более простого выражения?

Ответы [ 3 ]

9 голосов
/ 07 июля 2011

Я не знаю никакой функциональности, но вы могли бы просто запросить:

SELECT SUM(CASE WHEN p.end_dt IS NULL THEN 1 ELSE 0 END) / COUNT(*) * 100
  FROM PACKAGES p
6 голосов
/ 07 июля 2011

Итак, в основном формула имеет вид

COUNT(NULL-valued "end_dt") / COUNT(*) * 100

Теперь, COUNT(NULL-valued "end_dt") синтаксически неверен, но его можно представить как COUNT(*) - COUNT(end_dt).Итак, формула может быть такой:

(COUNT(*) - COUNT(end_dt)) / COUNT(*) * 100

Если мы просто немного упростим ее, мы получим следующее:

SELECT (1 - COUNT(end_dt) <s>* 1.0</s> / COUNT(*)) * 100 AS Percent
FROM packages

Бит * 1.0 преобразуетцелочисленный результат от COUNT до нецелого значения, поэтому делите также нецелое деление.

Вышеприведенное предложение и соответствующая часть сценария оказались полным мусором.В отличие от некоторых других серверов баз данных, Oracle не выполняет целочисленное деление, даже если оба операнда являются целыми числами. Эта страница документа не содержит подсказок о таком поведении оператора деления.

3 голосов
/ 16 июля 2012

Оригинальный пост немного длинен в зубе, но это должно сработать, используя функцию " ratio_to_report ", доступную с Oracle 8i:

SELECT
  NVL2(END_DT, 'NOT NULL', 'NULL') END_DT,
  RATIO_TO_REPORT(COUNT(*)) OVER () AS PCT_TOTAL
FROM
  PACKAGES
GROUP BY
  NVL2(END_DT, 'NOT NULL', 'NULL');
...