2017-06-07 7 views
1

Quelqu'un peut-il s'il vous plaît aidez-moi à trouver ce qui suit à l'aide d'un oracle sql danssql oracle pour trouver le rapport avec le regroupement par une colonne

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 

Je ne peux pas comprendre comment calculer le pourcentage dans le GROUP BY

+++++++++
Explication:
essayer d'obtenir le rapport en regroupant COLUMNA
les résultats du premier rang est une groupement de ColumnA comme 20/(20 + 10 + 30) = 0,333333333
Groupement de deux ColumnA 10/(10 + 30) = 0,25
dernier résultat de la ligne de regroupement 3 à partir de ColumnA est comme 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 
+0

révisée SELECT ColumnA, ColumnB, ColumnB/somme (ColumnB) par groupe ColumnA comme Ratio DE TableX GROUP BY ColumnA ORDER BY ColumnA – user2292524

Répondre

3

Vous pouvez utiliser la fonction de fenêtre sum pour ce faire.

SELECT 
    ColumnA, 
    ColumnB, 
    ColumnB/(sum(ColumnB) over(partition by ColumnA)) as Ratio 
FROM 
    TableX 
ORDER BY 
    ColumnA 
+0

Oui, il a travaillé !! – user2292524

0

Une fonction de fenêtre est le plus propre et obtient mon vote. Pour une autre perspective cependant, vous pouvez également utiliser une sous-requête pour déterminer quelle est la valeur totale pour chaque groupe COLUMNA. Ensuite, joignez-le à votre table d'origine et utilisez la somme pour calculer votre ratio.

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