0Pricing
SQL Interview Prep · Lección

Distribución acumulada y porcentaje del total

Calcule porcentajes acumulados y la proporción del total dentro de las particiones

Distribución acumulada y porcentaje del total es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

La pregunta sobre el porcentaje del total

Una pregunta habitual en entrevistas sobre informes es: "¿Qué porcentaje de los ingresos totales representa cada categoría?" y su variante acumulada: "¿Cuál es la proporción acumulada del total?"

El truco consiste en dividir el valor de cada fila entre un agregado de ventana calculado sobre toda la partición. Lo que se evalúa es saber que puede incluir un total general en una función de ventana, sin necesidad de una autocombinación.

SUM de ventana sin ORDER BY = total general

Este es el paso clave: SUM(amount) OVER (), con un OVER vacío y sin ORDER BY, devuelve el total de todo el conjunto de resultados y lo repite en cada fila.

Como no hay ORDER BY, no existe un marco acumulado, por lo que el marco predeterminado es la partición completa. Ese total repetido en cada fila es exactamente el denominador que necesita para calcular el porcentaje del total.

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

Cálculo del porcentaje del total

Divida el valor de la fila entre el total general de la ventana y multiplique el resultado por 100. Convierta el valor a decimal para evitar que la división entera se trunque a cero.

Esta consulta de una sola pasada sustituye el patrón antiguo de usar una subconsulta para calcular el total y combinarla después con las filas de detalle. Es más corta, más rápida y fácil de leer.

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

La trampa de la división entera

Una trampa clásica de las entrevistas: en muchas bases de datos, amount / total sobre columnas enteras realiza una división entera, por lo que un resultado menor que 1 se convierte en 0.

Corríjalo multiplicando primero por 100.0 (un literal numérico) o convirtiendo uno de los operandos: amount::numeric / total. Olvidarlo devuelve una columna de ceros, algo que los entrevistadores detectan al instante.

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

Porcentaje del total dentro de un grupo

Añada PARTITION BY para que la proporción de cada fila sea relativa a su grupo y no a toda la tabla. Por ejemplo, el porcentaje de ventas de cada producto dentro de su propia región.

El denominador SUM(amount) OVER (PARTITION BY region) se reinicia ahora por región, por lo que los porcentajes de cada región suman 100.

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

Porcentaje acumulado del total

Combine un numerador acumulado con un denominador fijo para obtener la proporción acumulada del total: cuánto del total general se ha acumulado hasta cada fila.

El numerador usa ORDER BY (acumulado), mientras que el denominador usa un OVER () vacío (total general). La última fila siempre alcanza el 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: distribución acumulada

SQL incluye una función integrada para la distribución acumulada: CUME_DIST(). Devuelve la proporción de filas cuyo valor de ORDER BY es menor o igual que el de la fila actual, un número del intervalo (0, 1].

A diferencia de una proporción acumulada del importe calculada manualmente, CUME_DIST se refiere a la posición de la fila y responde a la pregunta "¿qué proporción de filas se encuentra en este valor o por debajo de él?" Es útil para informes de tipo percentil.

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

PERCENT_RANK y su diferencia

Una función estrechamente relacionada es PERCENT_RANK(), definida como (rank - 1) / (total_rows - 1), con valores entre 0 y 1.

La diferencia importante en una entrevista es la siguiente: CUME_DIST incluye la fila actual en su numerador ("en este valor o por debajo"), mientras que PERCENT_RANK representa el rango relativo y comienza en 0 para la primera fila. Devuelven valores diferentes, y confundirlas es un error habitual.

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

Análisis de Pareto / 80-20

El porcentaje acumulado del total permite realizar un análisis de Pareto: "¿qué clientes principales representan el 80 % de los ingresos?" Ordene en orden descendente por amount, calcule la proporción acumulada y filtre cuando esta supere por primera vez el 80 %.

Como los resultados de las funciones de ventana no pueden aparecer en WHERE, incluya el cálculo en una CTE y filtre en la consulta externa; es la misma regla que se aplica a todas las funciones de ventana.

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;

Redondeo y conciliación

Tenga cuidado: redondear cada porcentaje a 2 decimales puede hacer que la suma de la columna sea 99.99 o 100.01 en lugar de exactamente 100. En una entrevista pueden preguntarle cómo garantiza que las partes sumen el total.

Respuestas habituales: redondear solo para mostrar los datos, conservar la precisión completa para los cálculos o aplicar un ajuste de mayor resto a una fila. Es más importante identificar el problema que la solución concreta.

Puntos clave para la entrevista

Aspectos clave que debe saber explicar:

  • SUM(x) OVER () sin ORDER BY = total general en cada fila.
  • Multiplique por 100.0 para evitar la división entera.
  • PARTITION BY para obtener proporciones por grupo.
  • Numerador acumulado sobre un denominador de total general = proporción acumulada.
  • CUME_DIST y PERCENT_RANK para la distribución; debe saber en qué se diferencian.
  • Envuelva la consulta en un CTE para filtrar por Pareto o por umbral.

Comprobación rápida

¿Cómo obtiene el total general de todo el conjunto de resultados en cada fila?

Resumen: distribución y porcentaje del total

El porcentaje del total divide el valor de una fila entre SUM(x) OVER (), el total general que se devuelve en cada fila; multiplique siempre por 100.0 para evitar la división entera y añada PARTITION BY para obtener proporciones por grupo. Un numerador acumulado sobre un denominador de total general produce una proporción acumulada que termina en 100 %, base del análisis de Pareto.

Para una distribución basada en la posición, use CUME_DIST y PERCENT_RANK, y recuerde la salvedad relacionada con la conciliación del redondeo. Con esto se completan los totales acumulados y los promedios móviles.

Preguntas frecuentes

¿La lección «Distribución acumulada y porcentaje del total» es gratis?

Sí — el texto completo de «Distribución acumulada y porcentaje del total» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Distribución acumulada y porcentaje del total»?

Calcule porcentajes acumulados y la proporción del total dentro de las particiones Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Distribución acumulada y porcentaje del total»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Sumas acumuladas con marcos de ventana
  2. Marcos ROWS frente a RANGE
  3. Medias móviles en una ventana deslizante
  4. Distribución acumulada y porcentaje del total
← Volver a SQL Interview Prep