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

Consulta conflictiva

Estas en el tema de Consulta conflictiva en el foro de SQL Server en Foros del Web. Hola! Tengo un conflicto con una consulta por si es posible o no hacerla... explico mi problema con un ejemplo con 2 tablas : Cliente ...
  #1 (permalink)  
Antiguo 25/06/2009, 10:00
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Consulta conflictiva

Hola!

Tengo un conflicto con una consulta por si es posible o no hacerla...

explico mi problema con un ejemplo con 2 tablas : Cliente y Contacto

Cliente -------------------- Contacto

Id | Cliente | -------- Id_cli | Contacto |admin|

1 | cliente1 | ----------- 1 | Juan- | - si - |
2 | cliente2 | ----------- 2 | Pedro | - no - |
3 | cliente2 | ----------- 3 | Dann- | - no - |
4 | cliente3 | ----------- 4 | Cary- | - no - |
5 | cliente4 | ----------- 5 | Maria | - no - |
6 | cliente4 | ----------- 6 | Alex- | - si - |


El resultado debe ser "todos los clientes que entre sus contactos no tengan un administrador"

si un cliente tiene al menos 1 contacto admin esta bien..osea no ai q mostrarlo..
como es el caso del "cliente4" tiene 2 contactos uno admin y el otro no.. ese caso esta bueno.. asi q no hay q mostrarlo..

el Resultado seria:

TablaRespuesta
-----------------------
Id | Cliente | Contacto | admin |

2 | cliente2 | Pedro | - no - |
3 | cliente2 | Dann | - no - |
4 | cliente3 | Cary- | - no - |


En el mejor de los casos solo mencionar 1 sola vez al cliente.. es lo que se pide..
"clientes q no tengas entre sus contactos asignado a un administrador"

osea solo : Cliente2 y Cliente3


espero se entienda mi consulta!

Gracias.

Última edición por daniwish; 25/06/2009 a las 10:07
  #2 (permalink)  
Antiguo 25/06/2009, 10:08
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Respuesta: Consulta conflictiva

Primero que todo no se si fue error al colocar el ejemplo pero tiene problemas en las tablas. Si tiene una tabla clientes a CLiente dos deberia asignarle solo un ID para que se peuda relacionar facilmente con la tabla contactos lo mismo con cliente 4. Solucione eso y nos avisa para ayudarle con la consulta
  #3 (permalink)  
Antiguo 25/06/2009, 10:26
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

no hay error..

un cliente puede ingresarse muchas veces en la base de datos si es necesario..
por lo mismo.. el contacto es quien lo ingresa ..

ahora necesito saber.. que clientes fueron ingresados por contactos no administradores..
mm.. es una base de datos compliacada...
pero para que se explique mejor.. digamos q la tabla Clientes.. son las "Ordenes de Trabajo de un Cliente" osea el ID es asignado por orden de trabajo.. y logicamente un cliente puede tener muchas ordenes de trabajo.

Gracias..^^
  #4 (permalink)  
Antiguo 25/06/2009, 14:21
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

mmm.. parece q no se puede en una simple consulta SQL
  #5 (permalink)  
Antiguo 25/06/2009, 17:19
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Consulta conflictiva

Si dices: "mencionar 1 sola vez al cliente" cual contacto dejas?
Muestranos que tienes avanzado.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 26/06/2009, 09:29
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

da igual que contacto deje... la informacion que necesito rescatar son los clientes...

de avanzado..mmm no mucho.. estoi intentando una rutina en ASP ..
hice una consulta que me devuelva los registros ordenados por clientes y admin
busco al cliente y pregunto si tiene contacto admin o no, si lo tiene.. creo una variable "tiene"
y si no creo una variable "notiene"
entonces al preguntar por el 2 registro de la consulta digo.. si el nombre es igual al anterior y la variable es "tiene".. que continue al siguiente registro hasta que encuentre un cliente con distinto nombre..
(la verdad tengo q ordenar mas esta idea,pero algo asi estoi haciendo )

pero el objetivo es q me dijeron q se podria usar algo asi como un LEFT join para hacer la consulta.. pero.. no logro encajar el LEFT en la consulta q necesito..

por eso solo me queda hacer la rutina en ASP

lo que queria lograr.. era hacer lo que necesito con 1 sola consulta SQL...
  #7 (permalink)  
Antiguo 26/06/2009, 10:56
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Consulta conflictiva

Puedes hacerlo con LEFT JOIN, pero creo que seria algo confuso.
Yo lo haria usando 2 conjuntos. Es simple:
A - clientes
B - contactos de clientes que no tienen ni un admin
La interseccion de ambos conjuntos es lo que necesitas, es decir, haces INNER JOIN.
La tarea esta en definir el conjunto B.
Anda, haz algo y te ayudo segun tus avances, sino no aprenderas nada.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #8 (permalink)  
Antiguo 26/06/2009, 11:26
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

mira esto es lo que llevo...
y me acaba de mandar un error...

( Microsoft OLE DB Provider for SQL Server (0x80040E14)
Incorrect syntax near 'MAURICIO'. )

Código:
<% sq1_busca_cliente = "SELECT top 100 Clientes.Rut, Clientes.Digito, Clientes.RazonSocial, Clientes.Clientede, Contacto.administrador FROM Contacto INNER JOIN Clientes ON Contacto.idEmpresas = Clientes.id WHERE Contacto.estado = '1' AND Clientes.estado = '2' ORDER BY Clientes.RazonSocial, Contacto.administrador"

set sql_rs = connect.execute(sq1_busca_cliente)
%>
Resultado de clientes sin contacto Administrador
   
 <%   
cliente = ""

do until sql_rs.eof
        
 if (cliente <> sql_rs("RazonSocial")) then
	
	 cliente = sql_rs("RazonSocial")
	sql_2 ="SELECT Clientes.RazonSocial, Contacto.administrador FROM Cliente INNER JOIN Contacto ON Contacto.idEmpresas = Clientes.id WHERE Contacto.estado = '1' AND Clientes.estado = '2' AND Clientes.RazonSocial="&cliente
	set sql_2_rs = connect.execute(sql_2)
	         
			 
		sum = 0
		do until sql_2_rs.eof
		       
		   if (sql_2_rs("administrador") = 1) then 
	              sum = sum + 1
		   end if
			
		sql_2_rs.movenext
		loop		  
				  
		   if (sum < 1) then	
				
	 response.Write sq1_busca_cliente("RazonSocial")

	    end if
    end if
       
 
sql_rs.movenext
loop

%>

hago una consulta q me trae todos los clientes
luego hago otra consulta que me trae todos los contactos de un cliente
y pregunto si el contacto es admin o no ("administrador") = 1 , si es admin entonces creo un contador(sum) y le sumo 1..
luego cuando termine con el primer cliente y todos sus contactos si el contador (sum) es menor a 1 .. quiere decir q entre sus contactos no abia admin.. asi q ese registro lo imprimo en pantalla .

bueno quizas con esto se entienda la idea...
  #9 (permalink)  
Antiguo 26/06/2009, 11:56
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Consulta conflictiva

A ver, te doy un avance:
Código SQL:
Ver original
  1. SELECT C.*
  2. FROM cliente C
  3. INNER JOIN (
  4.     SELECT T1.cliente
  5.     FROM cliente T1
  6.     INNER JOIN contacto T2 ON T1.id=T2.id
  7.     GROUP BY T1.cliente
  8.     HAVING COUNT(DISTINCT admin)>1
  9. ) T ON C.id=T.id
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #10 (permalink)  
Antiguo 26/06/2009, 12:58
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

INNER JOIN dentro de INNER JOIN!!
aaaa colapsoo!!! @_@

iwal es logico y entendible.. T1 supongo q es tabla1 y T2 tabla2
pero "T" y "C" ?

disculpa las molestias .. pero a q te refieres con:
HAVING COUNT(DISTINCT admin)>1

gracias!^^
  #11 (permalink)  
Antiguo 26/06/2009, 14:57
 
Fecha de Ingreso: enero-2008
Ubicación: Santiago
Mensajes: 14
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Consulta conflictiva

Logre hacerla en 1 sola consulta!!
la idea era el LEFT JOIN ...
hice 1 consulta para traer todos los clientes con admin 1
y otra consulta pra traer los clientes con admin 0 y los agrupe por nombre de cliente
luego el LEFT JOIN hizo su trabajo.. y rescate todos los resultados que me arrojaban resultado NULL.. ya q esos no tenian niun contacto admin!


SELECT Clientes.Rut, Clientes.Digito, Clientes.RazonSocial, Clientes.Clientede
FROM clientes INNER JOIN (SELECT * FROM (SELECT idEmpresas AS ide FROM contacto WHERE administrador = 0 GROUP BY idEmpresas) AS tbl1
LEFT OUTER JOIN
(SELECT idEmpresas FROM contacto WHERE administrador = 1 GROUP BY idEmpresas) AS tbl2
ON tbl1.ide = tbl2.idEmpresas WHERE tbl2.idEmpresas IS NULL) AS ct2
ON clientes.id = ct2.ide


la idea de un inner join dentro de otro me abrio la mente xd
para hacer un LEFT JOIN entre 2 consultas... eso es nuevo para mi
todos los dias se aprende algo nuevo!


flaviovich gracias por tu tiempo!!
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 09:29.