2009-03-10 37 views
8

¿Por qué no puedo usar una columna temporal en la cláusula where?Cómo usar una columna temporal en la cláusula where

Por ejemplo, la siguiente 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 nos lleva a dos columnas, una llamada product_brand y uno llamado 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 sólo 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' 

Respuesta

13

Uso HAVING 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 

WHERE se evalúa antes de la GROUP BY. HAVING se evalúa después.

+0

Estás equivocado. No funciona en TENER también. – thorn

+0

@thorn: siempre funcionó para mí en MySQL. Tal vez hay algo más incorrecto en su consulta? ¿Qué versión de MySQL está ejecutando, y tiene habilitada una de las opciones estrictas? – derobert

+0

Lo siento. Confundí MySQL con MS SQL Server. – thorn

0

Debido a que tiene no tengo idea de qué es esa columna hasta después de que haya terminado el procesamiento.

Si desea acceder a la columna con ese nombre, deberá utilizar una subconsulta, de lo contrario tendrá que calificar la columna sin el nombre que le dio, repitiendo su declaración de caso.

2

Porque en SQL las columnas primero se "seleccionan" y luego se "proyectan".

+0

Eso es mucho más conciso que mi intento de explicar :) – TheTXI

+0

Gracias TheTXI: P, hurra por los cursos de diseño de DB que finalmente dieron sus frutos. –

2

usted tiene que utilizar 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 

Ésta es la misma para cualquier campo calculado en cualquier sentencia SQL.

Para simplificar:

Select Max(Points) as Highest where Highest > 10 

no va a funcionar, pero:

Select Max(Points) as Highest where Max(Points) > 10 

voluntad. Es lo mismo en tu caso.

0

Si leo su intención correctamente, puede volver a escribir esta consulta para que diga:

Select 
product_brand, 
COUNT(product_brand) AS brand_count 
FROM 
products 
GROUP BY 
product_brand 
HAVING 
COUNT(product_brand) > 50 

Esto le dará a todos los que tienen un product_brandscount > 50 y también le mostrará el recuento de cada uno.

Cuestiones relacionadas