SQL в оракуле, чтобы найти соотношение с группировкой по столбцу
Может кто-нибудь, пожалуйста, помогите мне найти следующее с помощью SQL в Oracle
Input in oracle TableX --
ColumnA |ColumnB
1 |20
1 |10
1 |30
2 |10
2 |30
3 |20
-- Desired result
ColumnA |ColumnB |Ratio
1 |20 |0.333333333
1 |10 |0.166666667
1 |30 |0.5
2 |10 |0.25
2 |30 |0.75
3 |20 |1
SELECT
ColumnA,
ColumnB,
ColumnA/sum(ColumnB) group ColumnA by as Ratio
FROM
TableX
GROUP BY
ColumnA
ORDER BY
ColumnA
Я не могу понять, как рассчитать процент в пределах GROUP BY
+++++++++
Объяснение:
Пытаясь получить соотношение путем группировки ColumnA
Результаты первой строки группируют 1 из столбца A как 20/(20+10+30) = 0,333333333
Группировка 2 из столбца A 10/(10+30) = 0,25
Группировка результатов последней строки 3 из ColumnA выглядит как 20/20 = 1
Hence the sum of 0.333333333+0.166666667+0.5 = 1
sum of 0.25 + 0.75 = 1
sum of 1+0 = 1
3 ответа
Вы можете использовать sum
оконная функция, чтобы сделать это.
SELECT
ColumnA,
ColumnB,
ColumnB/(sum(ColumnB) over(partition by ColumnA)) as Ratio
FROM
TableX
ORDER BY
ColumnA
Когда существуют функции, которые делают именно то , что вам нужно, лучше всего использовать эти функции. В этом случае функция RATIO_TO_REPORT
, https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions124.htm
select columnA, columnB,
ratio_to_report(columnB) over (partition by columnA) as ratio
from tablex
order by columnA -- if needed
;
Функция окна является самой чистой и получает мой голос. Однако, с другой стороны, вы также можете использовать подзапрос, чтобы выяснить, каково общее значение для каждой группы COLUMNA. Затем присоедините это обратно к вашей исходной таблице и используйте сумму для расчета вашего коэффициента.
WITH SUM_TABLE AS (SELECT COLUMNA, SUM(COLUMNB) AS COLSUM FROM TABLEX GROUP BY COLUMNA)
SELECT t1.COLUMNA, t1.COLUMNB, t1.COLUMNB/st.COLSUM AS RATIO
FROM TABLEX t1 LEFT JOIN SUM_TABLE st ON st.COLUMNA = t1.COLUMNA