0Pricing
SQL Interview Prep · Leçon

Distribution cumulée et pourcentage du total

Calculer les pourcentages cumulés et la part du total au sein des partitions

Distribution cumulée et pourcentage du total est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

La question du pourcentage du total

Une question classique en entretien sur la génération de rapports : « Quel pourcentage du chiffre d’affaires total chaque catégorie représente-t-elle ? » et sa variante cumulative : « Quelle est la part cumulée du total ? »

L’astuce consiste à diviser la valeur de chaque ligne par un agrégat de fenêtre calculé sur toute la partition. Savoir qu’il est possible de placer un total général dans une fonction de fenêtre, sans jointure réflexive, est précisément la compétence évaluée.

SUM de fenêtre sans ORDER BY = total général

Voici l’opération clé : SUM(amount) OVER () avec un OVER vide et sans ORDER BY renvoie le total de l’ensemble du jeu de résultats, répété sur chaque ligne.

Comme il n’y a pas de ORDER BY, il n’y a pas de cadre cumulatif ; le cadre par défaut est donc la partition entière. Ce total répété sur chaque ligne est exactement le dénominateur nécessaire pour calculer un pourcentage du total.

SELECT
  category,
  amount,
  SUM(amount) OVER () AS grand_total
FROM category_sales;

Calculer le pourcentage du total

Divisez la valeur de la ligne par le total général de la fenêtre, puis multipliez par 100. Convertissez en nombre décimal afin que la division entière ne soit pas tronquée à zéro.

Cette requête en une seule passe remplace l’ancienne méthode qui consistait à utiliser une sous-requête pour calculer le total, puis à la joindre de nouveau aux lignes détaillées. Elle est plus courte, plus rapide et plus lisible.

SELECT
  category,
  amount,
  ROUND(
    100.0 * amount / SUM(amount) OVER (),
    2
  ) AS pct_of_total
FROM category_sales;

Le piège de la division entière

Un piège classique en entretien : dans de nombreuses bases de données, amount / total sur des colonnes entières effectue une division entière, si bien qu’un résultat inférieur à 1 devient 0.

Corrigez cela en multipliant d’abord par 100.0 (un littéral numérique), ou en convertissant un opérande : amount::numeric / total. Oublier ce point produit une colonne remplie de zéros, ce que les recruteurs repèrent immédiatement.

SELECT
  category,
  amount * 1.0 / SUM(amount) OVER () AS share,
  CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;

Pourcentage du total au sein d’un groupe

Ajoutez PARTITION BY afin que la part de chaque ligne soit relative à son groupe plutôt qu’à l’ensemble de la table. Par exemple, le pourcentage des ventes de chaque produit dans sa propre région.

Le dénominateur SUM(amount) OVER (PARTITION BY region) se réinitialise maintenant pour chaque région, si bien que les pourcentages totalisent 100 % dans chaque région.

SELECT
  region,
  product,
  amount,
  ROUND(
    100.0 * amount / SUM(amount) OVER (PARTITION BY region),
    2
  ) AS pct_of_region
FROM regional_sales;

Pourcentage cumulé du total

Combinez un numérateur cumulatif et un dénominateur fixe pour obtenir une part cumulée du total : la proportion du total général accumulée jusqu’à chaque ligne.

Le numérateur utilise ORDER BY (cumulatif), tandis que le dénominateur utilise un OVER () vide (total général). La dernière ligne atteint toujours 100 %.

SELECT
  sale_date,
  amount,
  ROUND(
    100.0 * SUM(amount) OVER (ORDER BY sale_date)
          / SUM(amount) OVER (),
    2
  ) AS running_pct
FROM daily_sales;

CUME_DIST : distribution cumulative

SQL propose une fonction intégrée pour la distribution cumulative : CUME_DIST(). Elle renvoie la fraction des lignes dont la valeur ORDER BY est inférieure ou égale à celle de la ligne actuelle, un nombre dans (0, 1].

Contrairement à une part cumulée calculée manuellement à partir d’un montant, CUME_DIST concerne la position de la ligne et répond à la question « quelle proportion des lignes se situe à cette valeur ou en dessous ? ». Cette fonction est utile pour les rapports de type percentile.

SELECT
  score,
  CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;

PERCENT_RANK et sa différence

Une fonction proche est PERCENT_RANK(), définie comme (rank - 1) / (total_rows - 1), avec une valeur comprise entre 0 et 1.

La distinction importante en entretien est la suivante : CUME_DIST inclut la ligne actuelle dans son numérateur (« à cette valeur ou en dessous »), tandis que PERCENT_RANK représente un rang relatif commençant à 0 pour la première ligne. Les deux fonctions produisent donc des valeurs différentes, et les confondre est une erreur fréquente.

SELECT
  score,
  CUME_DIST()    OVER (ORDER BY score) AS cd,
  PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;

Analyse de Pareto / 80-20

Le pourcentage cumulé du total permet l’analyse de Pareto : « quels principaux clients représentent 80 % du chiffre d’affaires ? » Triez les montants par ordre décroissant, calculez la part cumulée, puis filtrez les lignes où cette part franchit pour la première fois 80 %.

Comme les résultats d’une fonction de fenêtre ne peuvent pas apparaître dans WHERE, encadrez le calcul dans un CTE et filtrez dans la requête externe, selon la même règle que pour toute fonction de fenêtre.

WITH ranked AS (
  SELECT
    customer_id,
    revenue,
    SUM(revenue) OVER (ORDER BY revenue DESC)
      / SUM(revenue) OVER () AS running_share
  FROM customer_revenue
)
SELECT *
FROM ranked
WHERE running_share <= 0.80;

Arrondis et rapprochement

Attention : arrondir chaque pourcentage à 2 décimales peut faire en sorte que la somme de la colonne soit de 99,99 ou de 100,01 au lieu d'être exactement égale à 100. Les recruteurs peuvent vous demander comment vous garantissez que la somme des parts est égale au tout.

Réponses courantes : arrondir uniquement à l'affichage, conserver toute la précision pour les calculs ou appliquer un ajustement selon la méthode du plus grand reste à l'une des lignes. Il est plus important de nommer le problème que de proposer la correction.

Points clés à retenir pour l'entretien

Principaux points à formuler à l'oral :

  • SUM(x) OVER () sans ORDER BY = total général sur chaque ligne.
  • Multipliez par 100.0 pour éviter la division entière.
  • PARTITION BY pour obtenir les parts par groupe.
  • Un numérateur cumulatif sur un dénominateur égal au total général = part cumulée.
  • CUME_DIST et PERCENT_RANK pour la répartition ; sachez les différencier.
  • Utilisez une CTE pour filtrer selon Pareto ou un seuil.

Vérification rapide

Comment obtenir le total général de l'ensemble du jeu de résultats sur chaque ligne ?

Récapitulatif : répartition et pourcentage du total

Le pourcentage du total divise la valeur d'une ligne par SUM(x) OVER (), le total général renvoyé sur chaque ligne ; multipliez toujours par 100.0 pour éviter la division entière et ajoutez PARTITION BY pour obtenir les parts par groupe. Un numérateur cumulatif divisé par un dénominateur égal au total général donne une part cumulée qui atteint 100 %, base de l'analyse de Pareto.

Pour une répartition fondée sur la position, utilisez CUME_DIST et PERCENT_RANK, et n'oubliez pas le problème de rapprochement lié aux arrondis. Vous avez ainsi terminé les totaux cumulés et les moyennes mobiles.

Questions Fréquemment Posées

La leçon « Distribution cumulée et pourcentage du total » est-elle gratuite ?

Oui — le texte complet de « Distribution cumulée et pourcentage du total » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Distribution cumulée et pourcentage du total » ?

Calculer les pourcentages cumulés et la part du total au sein des partitions Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Distribution cumulée et pourcentage du total » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Sommes cumulées avec les fenêtres
  2. Fenêtres ROWS ou RANGE
  3. Moyennes mobiles sur une fenêtre glissante
  4. Distribution cumulée et pourcentage du total
← Retour à SQL Interview Prep