Cómo usar una columna temporal en la cláusula where
-
08-07-2019 - |
Pregunta
¿Por qué no puedo usar una columna temporal en la cláusula where?
Por ejemplo, esta consulta:
Select
product_brand,
(CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
FROM
products
WHERE
1
GROUP BY
product_brand
Esto muestra dos columnas, una llamada product_brand
y otra llamada brand_count
. brand_count
se crea sobre la marcha y siempre es 1 o 0, dependiendo de si hay 50 o productos con esa marca.
Todo esto tiene sentido para mí, excepto que no puedo seleccionar solo si brand_count = 1
como en esta consulta a continuación:
Select
product_brand,
(CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
FROM
products
WHERE
brand_count = 1
GROUP BY
product_brand
que me da este error:
#1054 - Unknown column 'brand_count' in 'where clause'
Solución
Use HAVING
en su lugar:
Select
product_brand,
(CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
FROM products
GROUP BY product_brand
HAVING brand_count = 1
DONDE
se evalúa antes del GROUP BY
. HAVING
se evalúa después.
Otros consejos
Porque en SQL las columnas se seleccionan primero " y luego proyectado.
Debe usar la cláusula completa, por lo que necesitará:
Select
product_brand,
(CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
FROM products
WHERE
(CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) = 1
GROUP BY product_brand
Esto es lo mismo para cualquier campo calculado en cualquier instrucción SQL.
Para simplificar:
Select Max(Points) as Highest where Highest > 10
no funcionará, pero:
Select Max(Points) as Highest where Max(Points) > 10
lo hará. Es lo mismo en tu caso.
Porque no tiene idea de qué es esa columna hasta después de haber realizado el procesamiento.
Si desea acceder a la columna con ese nombre, deberá usar una subconsulta, de lo contrario tendrá que calificar la columna sin el nombre que le dio, repitiendo su declaración de caso.
Si leí tu intención correctamente, puedes volver a escribir esta consulta para leer:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
Esto le dará todas las product_brands
que tienen un count > 50
y también te mostrará
el recuento de cada uno.