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.
@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