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

Consultas Correlativas

Estas en el tema de Consultas Correlativas en el foro de SQL Server en Foros del Web. Holas , tengo un problema con 2 consultas correlativas 1. necesito Mostrar los Nombres de los Empleados que han realizado ventas y que dentro de ...
  #1 (permalink)  
Antiguo 20/05/2010, 01:57
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Exclamación Consultas Correlativas

Holas , tengo un problema con 2 consultas correlativas

1. necesito Mostrar los Nombres de los Empleados que han realizado ventas y que dentro de estas ventas Coincidan con el Producto 'Carne de Cordero'
mi consulta es la siguiente.

Select IdEmpleado,Apellidos+' '+Nombre as Vendedor
From Empleados
Where IdEmpleado in
(Select IdPedido,IdEmpleado
From Pedidos
where IdPedido in
(select D.IdPedido
from [Detalles de Pedidos] as D join Productos as P
on D.IdProducto=P.IdProducto
where P.NombreProducto='Carne de Cordero'))
order by Vendedor

pero me bota un error diciendome que en la subconsulta "no se Expecifica Exists"

2. Mostrar los Clientes con la Cantidad de pedidos realizados en un año enviado como parametro
mi consulta es la siguiente

Create procedure Usp_Clientes_Pedidos
@xAño as datetime
as
Select IdCliente,NombreCompañía,(Select Count(*) From Pedidos where Pedidos.IdCliente=clientes.IdCliente and Convert(int,getdate()-Pedidos.FechaPedido)=year(@xAño))
as Cantidad_Pedidos
from Clientes
order by 2
Print getdate()

pero me Arroja 0 la Cantidad convertida a entero cuando coloco el año.

mi Base de datos se llama Empresa con mis tablas : "Productos","Clientes","Pedidos","Empleados" , hay mas pero solo estoy usando estas para las consultas. por favor necesito ayuda gracias de antemano
  #2 (permalink)  
Antiguo 20/05/2010, 09:59
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: Consultas Correlativas

Código SQL:
Ver original
  1. SELECT DISTINCT IdEmpleado,Apellidos+' '+Nombre AS Vendedor
  2. FROM Empleados E
  3. INNER JOIN Pedidos P ON E.IdEmpleado = P.IdEmpleado
  4. INNER JOIN [Detalles de Pedidos] D ON P.IdPedido = D.IdPedido
  5. INNER JOIN Productos PR ON D.IdProducto = PR.IdProducto
  6. WHERE PR.NombreProducto = 'Carne de Cordero'
  7. ORDER BY Vendedor
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 20/05/2010, 10:15
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: Consultas Correlativas

Código SQL:
Ver original
  1. CREATE PROCEDURE Usp_Clientes_Pedidos
  2. @xAño AS INT
  3. AS
  4. SELECT IdCliente,NombreCompañía,COUNT(*) AS Cantidad_Pedidos
  5. FROM Clientes C
  6. INNER JOIN Pedidos P ON C.IdCliente=P.IdCliente
  7. WHERE YEAR(P.FechaPedido) = @xAño
  8. GROUP BY IdCliente,NombreCompañía
  9. ORDER BY 2
  10. --Print getdate()
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #4 (permalink)  
Antiguo 20/05/2010, 14:32
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Respuesta: Consultas Correlativas

Gracias por tu Respuesta , es buena idea usando el Inner join pero quisiera saber si hay otro metodo como por ejemplo usando el IN o el EXISTS con Subconsultas ya que ese es el Tema que estoy estudiando ahora. gracias de antemano
  #5 (permalink)  
Antiguo 20/05/2010, 14:55
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: Consultas Correlativas

Aca no se recomienda usar el IN, parece ser muy lento. En cambio EXISTS si se recomienda.
Seria asi:
Código SQL:
Ver original
  1. SELECT DISTINCT IdEmpleado,Apellidos+' '+Nombre AS Vendedor
  2. FROM Empleados E
  3. WHERE EXISTS(
  4. SELECT 1
  5. FROM Pedidos P
  6. INNER JOIN [Detalles de Pedidos] D ON P.IdPedido = D.IdPedido
  7. INNER JOIN Productos PR ON D.IdProducto = PR.IdProducto
  8. WHERE E.IdEmpleado = P.IdEmpleado
  9. AND PR.NombreProducto = 'Carne de Cordero'
  10. )
  11. ORDER BY Vendedor
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 20/05/2010, 15:36
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Respuesta: Consultas Correlativas

hola muchas gracias por tu respuesta , tengo una ultima duda en la consulta 2 podria usar un Exists ? seria algo asi para que me devuelva el IdCliente tambien

CREATE procedure Usp_Clientes_Pedidos
@xAño as int
AS
SELECT IdCliente,NombreCompañía,Count(*) as Cantidad_Pedidos
FROM Clientes C
where EXISTS
(Select * From Pedidos P inner join Clientes C
ON
C.IdCliente=P.IdCliente
WHERE year(P.FechaPedido) = @xAño)
GROUP BY NombreCompañía,IdCliente
ORDER BY 1
Print getdate()
  #7 (permalink)  
Antiguo 20/05/2010, 17:16
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: Consultas Correlativas

Creo que no tiene sentido un EXISTS en ese caso, porque necesitas la cantidad de pedidos.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.

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 00:16.