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

Funciones de agregado para cadenas, me haría falta para una consulta

Estas en el tema de Funciones de agregado para cadenas, me haría falta para una consulta en el foro de Mysql en Foros del Web. A ver, quiero realizar la siguiente consulta: una que obtenga el dni de los clientes que hayan comprado como mínimo un coche blanco y un ...
  #1 (permalink)  
Antiguo 15/06/2009, 17:13
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 2 meses
Puntos: 6
Funciones de agregado para cadenas, me haría falta para una consulta

A ver, quiero realizar la siguiente consulta:

una que obtenga el dni de los clientes que hayan comprado como mínimo un coche blanco y un coche rojo.

De una tabla que puede llamarse "compras" tal que así:

dni_cliente|cod_coche|color_coche

Podemos tener algo como:

0000001....1.....blanco
0000001....2.....azul
0000002....2.....blanco
0000002....4......rojo
0000003....5.....blanco

En este caso, sacaría el dni del cliente '00000002'.

¿Cómo se haría? He pensado en realizar un agregado por cliente, pero luego tengo que saber dos cosas: tanto el "count" de filas (mayor que dos), como que sean "blanco" y "rojo". Por eso pensé en una función de agregado que trabaje con cadenas.

He buscado y esto sería lo más parecido:

http://office.microsoft.com/es-es/ac...288263082.aspx

¿Alguien me puede orientar?
  #2 (permalink)  
Antiguo 15/06/2009, 19:26
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Funciones de agregado para cadenas, me haría falta para una consulta

Se me ocurre esta sentencia

Código sql:
Ver original
  1. SELECT dni_cliente
  2. FROM tu_tabla GROUP BY dni_cliente
  3. HAVING  GROUP_CONCAT(DISTINCT(color_coche))  = 'blanco,rojo'

Talvez se pueda mejorar

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 15/06/2009, 22:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Funciones de agregado para cadenas, me haría falta para una consulta

Cita:
Iniciado por Genetix Ver Mensaje
Se me ocurre esta sentencia

Código sql:
Ver original
  1. SELECT dni_cliente
  2. FROM tu_tabla GROUP BY dni_cliente
  3. HAVING  GROUP_CONCAT(DISTINCT(color_coche))  = 'blanco,rojo'

Talvez se pueda mejorar

Saludos!
Esto funcionaría perfecto para aquellos clientes que tengan únicamente carros blancos y rojos. Si hay un cliente que también tiene un carro de otro color, la consulta no lo mostraría.
ademas, sería necesario que el orden que recogiera del group_concat fuera blanco,rojo, si encontrara rojo,blanco tampoco mostraría.

Yo lo miraría mas por el lado de contar por cada cliente, la cantidad de carros rojos y blancos y realizar una validación del valores mayores a cero en dichas compras.
Con un ejemplo, sería algo así:

Código mysql:
Ver original
  1. SELECT dni,sum(if(color_coche='rojo','1','0')) rojo,sum(if(color_coche='blanco','1','0')) blanco
  2. FROM compras group by dni having rojo > 0 and blanco >0;

Pruebalo y nos cuentas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 15/06/2009, 23:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Funciones de agregado para cadenas, me haría falta para una consulta

O esta otra, que creo es algo más eficiente:

Código sql:
Ver original
  1. SELECT dni_cliente
  2. FROM compras WHERE color_coche IN ('blanco', 'rojo') GROUP BY dni_cliente
  3. HAVING  COUNT(DISTINCT(color_coche)) = 2

Última edición por jurena; 16/06/2009 a las 03:31
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 21:51.