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

Consulta con Right outher

Estas en el tema de Consulta con Right outher en el foro de SQL Server en Foros del Web. hola a todos, tengo un problema con una cobsulta a dos tablas de mi base de datos, tengo la siguiente consulta: SELECT COUNT(*) AS total, ...
  #1 (permalink)  
Antiguo 05/09/2007, 10:24
 
Fecha de Ingreso: julio-2006
Ubicación: cd. de México
Mensajes: 22
Antigüedad: 17 años, 9 meses
Puntos: 0
Información Consulta con Right outher

hola a todos, tengo un problema con una cobsulta a dos tablas de mi base de datos, tengo la siguiente consulta:

SELECT COUNT(*) AS total, AVG(telefonico.total) AS media, sucursal.sucursal, sucursal.nombre
FROM telefonico INNER JOIN
sucursal ON telefonico.sucursal = sucursal.nombre
WHERE (telefonico.region = '1') AND (telefonico.fcaptura BETWEEN CONVERT(DATETIME, '2007-08-01 00:00:00', 102) AND CONVERT(DATETIME,
'2007-08-31 00:00:00', 102))
GROUP BY telefonico.sucursal, sucursal.sucursal, sucursal.nombre
ORDER BY sucursal.sucursal

esta consulta me saca el promedio y la cantidad de registros de la tabla telefonico, la tabla sucursal la utilizo para poder sacar el numero de sucursal y ordernarlo por el el numero de la sucursal (sucursal.sucursal) el prblema es que en region 1 tengo 87 sucursales, y en telefonico (evalua sucursales) unicamente tengo capturadas 55 sucursales, quiero que me aparezcan las 87 sucursales aunque no esten evaluadas, y ale intente con RIGHT OUTER JOIN y LEFT OUTER JOIN o FULL OUTER JOIN y no me los muestra, espero que me puedan ayudar.

gracias.
  #2 (permalink)  
Antiguo 05/09/2007, 11:31
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Re: Consulta con Right outher

Código:
SELECT   s.sucursal
        ,s.nombre
        ,COUNT(*) AS total
        ,AVG(telefonico.total) AS media
FROM     sucursal  s
Left outer join
        telefonico t
ON      s.sucursal = t.nombre
WHERE   t.region = '1' AND 
        t.fcaptura BETWEEN CONVERT(DATETIME, '2007-08-01 00:00:00', 102) AND CONVERT(DATETIME, '2007-08-31 00:00:00', 102))
GROUP BY 
       ,s.sucursal
       ,s.nombre
ORDER BY 
        s.sucursal
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 05/09/2007, 12:17
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Consulta con Right outher

Andres95

Solo como comentario y tal vez una mejora en la busqueda, por performance (tiempo de respuesta, segun el plan de ejecucion), no utilizo BETWEEN para las fechas, por lo que yo cambiaria esta linea:

t.fcaptura >= '20070801' AND t.fcaptura <= '20070831'

Como veras, utilizo el formato ANSI para las fechas (yyyymmdd)
  #4 (permalink)  
Antiguo 05/09/2007, 12:44
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Consulta con Right outher

Ok, aunque yo prefiero el between por claridad en las sentencias.

Te comento que no he experimentado una diferencia marcada en el uso de una u otra forma. Si tienes datos que compartir (diferencias de tiempos de respuesta, articulos, etc) son bienvenidos...

Por otro lado, la parte del formato de fecha, yo prefiero utilizar variables y parametros de tipo fecha (datetime) y de esa forma ya no se requieren conversiones en el where. El peor de los casos sería aplicar la conversion a los campos de la tabla.


un saludo!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 05/09/2007, 17:12
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Consulta con Right outher

Bueno, es tan simple como establecer en ON los PLANES DE EJECUCION, ver los resultados de ambos query's (con between y con >= o <=) y tomar una decision.
  #6 (permalink)  
Antiguo 06/09/2007, 07:39
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Consulta con Right outher

Ok iislas, he realizado la prueba pero no veo la diferencia, por favor indicame que es lo que estoy omitiendo.

Te comento,

El query utilizado es el siguiente:

Código:
Set nocount on 

if object_id('tempdb..#tmpTemporal') is not null drop table #tmpTemporal

create table #tmpTemporal(iValue int Identity(1,1) Primary Key, dValue datetime)

Declare @IniDate as datetime, @EndDate datetime

Set @IniDate = getdate()
Set @EndDate = dateadd(mm,6,@IniDate)

print @IniDate
print @EndDate


while @IniDate <= @EndDate
Begin
   Insert into #tmpTemporal values(@IniDate)

   Set @IniDate = dateadd(hh,1,@IniDate)

End

Declare @pIniDate as datetime, @pEndDate as datetime

Select  @pIniDate = '20070901', @pEndDate = '20070925'
Select * from  #tmpTemporal where dValue between @pIniDate and @pEndDate
Select * from  #tmpTemporal where dValue >= @pIniDate and dValue <= @pEndDate
Y el plan de ejecucion me arroja exactamente los mismos numeros para ambas sentencias.

Adicionalmente observo que en la parte de arguments el SQL ha traducido el between en la sentencia equivalente con los operadores >= y <=

¿será por eso que no hay diferencias en los numeros?.




---


Saludos
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 06/09/2007 a las 07:45
  #7 (permalink)  
Antiguo 13/09/2007, 17:27
 
Fecha de Ingreso: julio-2006
Ubicación: cd. de México
Mensajes: 22
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Consulta con Right outher

Cita:
Iniciado por iislas Ver Mensaje
Bueno, es tan simple como establecer en ON los PLANES DE EJECUCION, ver los resultados de ambos query's (con between y con >= o <=) y tomar una decision.
hola de nuevo, y gracias por apoyarme, Andres95, disculpa pero no le entindo a tu codigo soy nuevo en esto de programar con sql, no se sipuedas hacer algo que sea un poco mas entendible.

y de igual manera te agradesco a ti iislas pero ya lo intente de esa manera pero los valores de total y media los distorciona.
  #8 (permalink)  
Antiguo 13/09/2007, 21:49
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Consulta con Right outher

Cita:
Iniciado por iislas Ver Mensaje
Bueno, es tan simple como establecer en ON los PLANES DE EJECUCION, ver los resultados de ambos query's (con between y con >= o <=) y tomar una decision.
A uno de mis "maestros" de SQL Server le pregunté exactamente lo mismo, cuando veíamos los temas de performance (había escuchado eso para Oracle).

Su respuesta fue que simplemente el optimizador de SQL Server convierte los BETWEEN en <= y >=, así que no hay diferencia de performance... fuera del performance del cerebro que está escribiendo los querys.

En su momento lo probé y el resultado fue exactamente lo que él me comentó, y lo que Andrés acaba de revisar.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #9 (permalink)  
Antiguo 14/09/2007, 06:56
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Re: Consulta con Right outher

Cita:
Iniciado por Mithrandir Ver Mensaje
A uno de mis "maestros" de SQL Server le pregunté exactamente lo mismo, cuando veíamos los temas de performance (había escuchado eso para Oracle).

Su respuesta fue que simplemente el optimizador de SQL Server convierte los BETWEEN en <= y >=, así que no hay diferencia de performance... fuera del performance del cerebro que está escribiendo los querys.

En su momento lo probé y el resultado fue exactamente lo que él me comentó, y lo que Andrés acaba de revisar.
Si, ya decia yo...
Entonces seguire usando en between....

----


Por otro lado Hebam, si los promedios salen diferentes puede ser porque en algunos valores el campo telefonico.total es nulo...

Exactamente que guarda ese valor?
podrias darnos un ejemplo de un calculo que realiza erroneamente ?

Código:
SELECT   s.sucursal
        ,s.nombre
        ,COUNT(*) AS total
        ,AVG(isnull(t.total),0) AS media
FROM     sucursal  s
Left outer join
        telefonico t
ON      s.sucursal = t.nombre
WHERE   t.region = '1' AND 
        t.fcaptura BETWEEN CONVERT(DATETIME, '2007-08-01 00:00:00', 102) AND CONVERT(DATETIME, '2007-08-31 00:00:00', 102))
GROUP BY 
       ,s.sucursal
       ,s.nombre
ORDER BY 
        s.sucursal
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 14/09/2007 a las 08:03
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 04:46.