2017-08-18 1 views
1

Y at-il une fonction d'oracle qui me aidera à calculer le pourcentage de lignes qui accepte une conditionlignes de pourcentage Calculer sur une valeur spécifique

Exemple Tableau:

WorkerId Salary DepartmentId 

    10001  2000.00  1 
    10002  2500.00  2 
    10004  3000.00  1 
    10005  3500.00  1 

Je voudrais savoir quel est le pourcentage de travailleurs qui ont le salaire sur 2100,00 par chaque département

Répondre

3

Vous pouvez utiliser RATIO_TO_REPORT:

SELECT departmentID, 100 * SUM(rr) AS total_percentage 
FROM (SELECT t.*, RATIO_TO_REPORT(1) OVER (PARTITION BY DepartmentId) AS rr 
     FROM your_tab t) s 
WHERE salary > 2100 
GROUP BY departmentId; 

DBFiddle Demo

Sortie:

DEPARTMENTID TOTAL_PERCENTAGE 
1   66.66 
2   100 
+0

@thenut Vous pouvez accepter ma réponse (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) si votre question a été résolue :) – lad2025

0

Essayez d'utiliser deux GROUP BY et JOIN

SELECT yt.DepartmentId, t.hs/count(*) * 100 
FROM your_tab yt 
JOIN 
(
    SELECT DepartmentId, count(*) as hs 
    FROM your_tab 
    WHERE salary > 2100 
    GROUP BY DepartmentId 
) t ON yt.DepartmentId = t.DepartmentId 
GROUP BY yt.DepartmentId, t.hs 

dbfiddle

0

Vous pouvez le faire sans avoir besoin d'utiliser un fu analytique nction, comme ceci:

WITH sample_data AS (SELECT 10001 workerid, 2000 salary, 1 departmentid FROM dual UNION ALL 
        SELECT 10002 workerid, 2500 salary, 2 departmentid FROM dual UNION ALL 
        SELECT 10004 workerid, 3000 salary, 1 departmentid FROM dual UNION ALL 
        SELECT 10005 workerid, 3500 salary, 1 departmentid FROM dual) 
-- end of subquery mimicking a table with your data in it. 
-- see SQL query below: 
SELECT departmentid, 
     100*(COUNT(CASE WHEN salary > 2100 THEN 1 END)/COUNT(*)) pct_earning_gt_2100 
FROM sample_data 
GROUP BY departmentid; 

DEPARTMENTID PCT_EARNING_GT_2100 
------------ ------------------- 
      1 66.6666666666667 
      2     100 

Il utilise un nombre conditionnel (rappelez-vous, les valeurs nulles sont ignorées par la plupart des fonctions d'agrégation) de décider combien de lignes remplissent la condition, avant de se diviser par le nombre total de lignes, par département. Cela devrait être plus performant que la solution impliquant la fonction analytique ratio_to_report, car il n'a pas besoin de faire cette étape supplémentaire avant de faire le groupe, mais vous devriez tester les deux solutions pour savoir laquelle est réellement meilleure avec vos données.