Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda con HAVING y AS

Estas en el tema de Ayuda con HAVING y AS en el foro de Mysql en Foros del Web. Buenas a todos, estoy hasta las !"#"!$ jajaja, no me sale una query que a mi parecer, es sencilla, tengo SELECT dd,estatus_op,COUNT(epep) FROM infinitum WHERE ...
  #1 (permalink)  
Antiguo 18/05/2010, 16:25
 
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Ayuda con HAVING y AS

Buenas a todos, estoy hasta las !"#"!$ jajaja, no me sale una query que a mi parecer, es sencilla, tengo SELECT dd,estatus_op,COUNT(epep) FROM infinitum WHERE sem_inireal=CONCAT('10','',WEEK(CURDATE())) OR sem_inicio=CONCAT('10','',WEEK(CURDATE())) GROUP BY estatus_op HAVING (estatus_op='EN PROCESO' OR estatus_op='INSTALADO') OR (estatus_op='NO PROGRAMADO')

Olviden todo, esta funcionando a la perfeccion, lo unico que quiero, es diferenciar con un AS o algo asi, aquellos que en el HAVING tienen (estatus_op="EN PROCESO" OR estatus_op="INSTALADO") se diferencien de aquellos con (estatus_op="NO PROGRAMADO"), lo podria hacer desde PHP, pero lo estoy haciendo para un reporteador, por lo que me pide todo digerido.

Perdon por la larga consulta, pero ya llevo rato intentando y no me sale.

Gracias por su ayuda.

Salu2
  #2 (permalink)  
Antiguo 18/05/2010, 17:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con HAVING y AS

AS es una cláusula obsoleta, que sólo tiene uso como compatibilidad hacia versiones anteriores de los DBMS. Es igual si la usas o no, porque el resultado será el mismo (y tendrás menos código ensuciando todo).
Volviendo al último detalle de lo que dices, la única forma de hacer alguna diferenciación es usando la función IF(), pero en tu caso ya tienes diferenciados en distintas líneas los resultados, ya que estás haciendo un agrupamiento precisamente por ese campo, y la consulta solamente te está devolviendo tres registros...
Así que, ¿qué es exactamente lo que deseas lograr? ¿Diferenciar cómo?

Código MySQL:
Ver original
  1.   dd,estatus_op,
  2.   COUNT(epep) CantEpep
  3. FROM infinitum
  4.   (sem_inireal=CONCAT('10','',WEEK(CURDATE()))
  5.   OR sem_inicio=CONCAT('10','',WEEK(CURDATE()))
  6.   ) AND (estatus_op='EN PROCESO' OR estatus_op='INSTALADO') OR (estatus_op='NO PROGRAMADO')
  7. GROUP BY estatus_op;

No comprendo bien por qué usas el HAVING para un uso que corresponde al WHERE (mas o menos como te lo pongo). Ten en cuenta lo que dice el manual:
Cita:
- No use HAVING para elementos que deban estar en la cláusula WHERE . Por ejemplo, no escriba lo siguiente:
Código MySQL:
Ver original
  1. mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
Escriba esto en su lugar:
Código MySQL:
Ver original
  1. mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
- La cláusula HAVING puede referirse a funciones de agregación, algo que no puede hacer la cláusula WHERE:
Código MySQL:
Ver original
  1. mysql> SELECT user, MAX(salary) FROM users
  2. ->     GROUP BY user HAVING MAX(salary)>10;
No te olvides que el que algo funcione, no quiere decir que sea óptimo hacerlo...
Una de las razones de la existencia del HAVING está precisamente en lograr verificar condiciones que surgen de las funciones agregadas, las cuales no pueden ir en el WHERE (el WHERE opera sobre cada registro, las funciones agregadas sobre múltiples, son conceptos incompatibles).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 18/05/2010 a las 19:27
  #3 (permalink)  
Antiguo 19/05/2010, 09:15
 
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Ayuda con HAVING y AS

Gracias por la clase y la aclaracion gnzsoloyo, ya modifique mi query usando todo en WHERE, mira, lo que quiero es lo siguiente: quiero hacer una grafica en mi reporteador, contabilizando aquellos proyectos que si inicio su instalacion(estatus_op="EN PROCESO", estatus_op="INSTALADO", estatus_op="ENTREGADO") en la semana en curso, y aquellos que no iniciaron su instalacion (estatus_op="PROGRAMADO", estatus_op="NO PROGRAMADO"), es decir, las siguientes 2 querys, hacerlas en una sola:

Código MySQL:
Ver original
  1. dd,estatus_op,  COUNT(epep)
  2. FROM infinitum
  3. WHERE  (sem_inireal=CONCAT('10','',WEEK(CURDATE()))  
  4. OR sem_inicio=CONCAT('10','',WEEK(CURDATE()))  )
  5. AND (estatus_op='EN PROCESO'
  6. OR estatus_op='INSTALADO'
  7. OR estatus_op='ENTREGADO')
  8. GROUP BY estatus_op;

El resultado de esta seria (omitiendo el resto de campos) por ejemplo:
"EN PROCESO" 5
"INSTALADO" 5
"ENTREGADO" 10

Código MySQL:
Ver original
  1. dd,estatus_op,  COUNT(epep)
  2. FROM infinitum
  3. WHERE  (sem_inireal=CONCAT('10','',WEEK(CURDATE()))  
  4. OR sem_inicio=CONCAT('10','',WEEK(CURDATE()))  )
  5. AND (estatus_op='PROGRAMADO'
  6. OR estatus_op='NO PROGRAMADO')
  7. GROUP BY estatus_op;

El resultado de esta seria (omitiendo el resto de campos) por ejemplo:
"NO PROGRAMADO" 5
"PROGRAMADO" 5

Yo quisiera que el resultado, en una sola query fuera:

INICIADOS 20
NO INICIADOS 10

espero ahora si me haya dado a entender mejor :) se que tendria que usar SUM seguramente, el detalle esta en que no se bien como.

Gracias por la atencion brindada.

salu2

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:16.