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
Другие вопросы по тегам