Resumen del curso/Escribe tu propio SQL2 de 4
Cuenta, suma y agrupa
Cuenta, suma y agrupa
Agrega con COUNT, SUM y AVG, agrupa por una columna y observa cómo los NULL distorsionan cada resultado.
Un número por grupo
Una agregación reduce muchas filas a un número. GROUP BY ejecuta esa agregación una vez por grupo. Así conviertes 1.200 pedidos en ingresos por categoría o en un recuento de pedidos por tienda.
bruin query --connection duckdb-default \
--description "order count and revenue by status" \
--query "SELECT order_status, COUNT(*) AS orders, SUM(order_total) AS revenue FROM orders GROUP BY order_status ORDER BY orders DESC;"
Mira el resultado antes de continuar. El estado de una fila aparece como <nil> (algunas herramientas imprimen NULL): es el grupo de pedidos sin estado, 24 en total. NULL forma su propio grupo en un GROUP BY. No pierdas de vista esa fila: va a importar dos veces en esta lección.
WHERE filtra filas antes de agrupar. HAVING filtra grupos después de agregar. Usa WHERE order_total > 0 para descartar filas primero y HAVING SUM(order_total) > 10000 para conservar solo grupos grandes. Confundirlos es el error más común en este nivel.
Tres recuentos que no coinciden
COUNT(*) cuenta filas. COUNT(column) cuenta filas en las que esa columna no es NULL. COUNT(DISTINCT column) cuenta valores distintos que no son NULL. Ejecuta los tres sobre unit_cost, que es NULL en 57 líneas de pedido:
bruin query --connection duckdb-default \
--description "three counts of unit_cost that disagree" \
--query "SELECT COUNT(*) AS rows, COUNT(unit_cost) AS non_null, COUNT(DISTINCT unit_cost) AS distinct_values FROM order_items;"
rows es 2.880 y non_null es 2.823, una diferencia de exactamente 57. AVG(unit_cost) divide entre 2.823, no 2.880, porque AVG omite los NULL. El denominador no es el que suponías, así que la media es mayor de lo que sugiere una lectura por línea.
Una lista de inclusión también descarta NULL
Has aprendido que != 'cancelled' descarta los estados NULL. Una lista de inclusión hace lo mismo y parece más segura, por eso engaña a la gente. order_status IN ('completed', 'shipped') conserva solo esos dos valores y descarta silenciosamente todos los estados NULL junto con los estados que querías excluir.
Los estados que ves excluir - cancelled, returned, processing - son una elección intencionada. Las filas NULL no lo son. No aparecen en ninguna lista, así que nada en la consulta indica que han desaparecido. Mide exactamente qué se esfumó sin tu consentimiento:
bruin query --connection duckdb-default \
--description "orders silently dropped by an inclusion list" \
--query "SELECT COUNT(*) AS dropped_orders, SUM(order_total) AS dropped_revenue FROM orders WHERE order_status IS NULL;"
La lista de inclusión descarta silenciosamente 24 pedidos con 10.900,00 en order_total: las mismas 24 filas con estado NULL que descartó el filtro !=, perdidas de la misma manera. Una lista de inclusión es tan peligrosa como una lista de exclusión. Ambas se comen los NULL.
Tu tarea
Haz agregaciones en queries/02-aggregates.sql. Escribe la consulta de recuento e ingresos por estado y lee el grupo NULL. Después confirma que los tres recuentos difieren exactamente en 57:
bruin query --connection duckdb-default \
--description "three counts of unit_cost that disagree" \
--query "SELECT COUNT(*) AS rows, COUNT(unit_cost) AS non_null, COUNT(DISTINCT unit_cost) AS distinct_values FROM order_items;"
rows debe ser 2.880 y non_null 2.823. Después confirma que order_status IN ('completed', 'shipped') descarta silenciosamente 24 pedidos por valor de 10.900,00 en order_total. Por último, escribe una consulta de ingresos totales por categoría de producto en 2023 y descubre qué categoría lidera. Decide por tu cuenta qué columna representa los ingresos y qué columna de fecha debes filtrar, y prepárate para defender ambas elecciones.
Comprueba lo que has entendido
- ¿Por qué
COUNT(unit_cost)es menor queCOUNT(*)y en cuánto? - ¿Qué descarta silenciosamente
order_status IN ('completed', 'shipped')y qué ingresos supone? - ¿Qué categoría de producto tuvo los ingresos más altos en 2023?
Hazlo con tu agente
Di next lesson y tu agente impartirá esta lección, te hará estas preguntas y después asignará la tarea anterior. Hazla a mano y luego di review my work: ejecutará tu consulta, la comprobará con una rúbrica y te dirá qué debes corregir o marcará la lección como terminada.