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' 
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top