Nivel 1 · ¿Cuántos clientes llegaron por referidos?
¿Es nuevo para ti? Lee primero el concepto: Cómo GROUP BY pliega filas en grupos
0 de 3
La solicitud

De Lauren Hayes, Gerente de Email Marketing
Tu objetivo
Desde customers, devuelve una fila con tres columnas: total_customers (todas las filas), with_referral (filas donde referral_source no es NULL) y referral_sources (número de valores distintos de referral_source que no son NULL).
- Lee de la tabla
customerspendiente - Muestra exactamente
total_customerswith_referralreferral_sourcespendiente - 1 filapendiente
Tu consulta
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Lauren, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
Una función de agregación colapsa muchas filas en un solo valor. COUNT es la que más usarás,
y tiene tres formas que responden tres preguntas distintas:
| expresión | cuenta |
|---|---|
COUNT(*) |
filas, sin importar lo que contengan |
COUNT(referral_source) |
filas donde referral_source no es NULL |
COUNT(DISTINCT referral_source) |
valores únicos que no son NULL |
SELECT
COUNT(*) AS total_customers,
COUNT(referral_source) AS with_referral,
COUNT(DISTINCT referral_source) AS referral_sources
FROM customers;
Sin GROUP BY, una consulta de agregación devuelve exactamente una fila: un resumen de toda la tabla (o de
las filas que sobrevivan al WHERE).
Por qué importa la diferencia
COUNT(columna) ignora los NULL en silencio. Eso es útil cuando lo quieres (“cuántos clientes tienen una
fuente registrada”) y un error cuando no. Supón que quieres el número de pedidos y escribes
COUNT(coupon_code). Obtienes el número de pedidos con cupón, y nada te lo dice.
Los hábitos seguros:
- Para contar filas, usa
COUNT(*). - Para contar “filas que tienen X”, usa
COUNT(x)a propósito y nombra el alias en consecuencia. - Para contar cosas únicas (clientes, productos, días), usa
COUNT(DISTINCT ...).
COUNT(1) es lo mismo que COUNT(*) en todas las bases de datos modernas. No hay diferencia de rendimiento,
pese a lo que digan publicaciones antiguas de foros.
Proporción de filas
Un seguimiento natural: ¿qué porcentaje de los clientes tiene una fuente de referencia?
SELECT ROUND(100.0 * COUNT(referral_source) / COUNT(*), 1) AS pct_with_referral
FROM customers;
El 100.0 hace que la división sea decimal. En Postgres, COUNT(...) devuelve un entero y
entero / entero se trunca, así que COUNT(referral_source) / COUNT(*) daría 0. DuckDB, MySQL
y BigQuery devuelven un decimal, pero escribir 100.0 * no cuesta nada y mantiene la consulta portable.
NULL y DISTINCT
COUNT(DISTINCT referral_source) no cuenta NULL como una fuente. SELECT DISTINCT referral_source
(del capítulo 1) sí muestra una fila NULL. Así que el conteo distinto es uno menos que el número de filas que devuelve
DISTINCT, si existe algún NULL. Espera esta pregunta en las entrevistas.
Errores comunes
COUNT(DISTINCT *)no es válido. UsaCOUNT(DISTINCT columna), oCOUNT(DISTINCT (a, b))en Postgres y DuckDB para combinaciones. MySQL aceptaCOUNT(DISTINCT a, b).- Contar sobre una columna con el grano equivocado.
COUNT(*)sobreorder_itemscuenta líneas, no pedidos. “Cuántos pedidos” a partir de líneas de pedido esCOUNT(DISTINCT order_id).
En SQL Server
COUNT(*), COUNT(columna) y COUNT(DISTINCT columna) se comportan igual. Los conteos son enteros, y un
entero dividido entre un entero se trunca allí, así que una proporción necesita un decimal en un lado:
SELECT 100.0 * COUNT(referral_source) / COUNT(*) AS pct_with_referral
FROM customers; ¡Linterna encendida!
Practicaste: countcount distinctnullaggregates
- Resuelto
- Sin pistas
- Al primer intento
