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

oTRO select feo

Estas en el tema de oTRO select feo en el foro de SQL Server en Foros del Web. Puede ser fácil pero NPI. Hago un select de unas tablas y los inserto en la tabla temporal #Temp1 y me trae los siguientes registros: ...
  #1 (permalink)  
Antiguo 09/04/2007, 15:51
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Pregunta oTRO select feo

Puede ser fácil pero NPI.

Hago un select de unas tablas y los inserto en la tabla temporal #Temp1 y me trae los siguientes registros:

Código:
IdEmpresa    IdOficina IdOrdenCompra     Monto1	Monto2	
2		7	1		50.0000	0.00
2		7	2		30.0000	0.00
2		7	3		10.0000	0.00
Hago otro select de otra tabla y los inserto en una tabla temportal #Temp2 y los resultados son los siguientes:

Código:
IdEmpresa    IdOficina IdOrdenCompra     Monto1	Monto2	
2		7	2		0.0000	50.00
2		7	3		0.0000	20.00
2		7	4		0.0000	60.00
y necesito de alguna manera meterlos en otra tabla temporal haciendo una union de los registros de cada tabla. La cable primaria son los tres primeros campos, Empresa, Oficina, y OrdenCompra y si un registro se repite solo tomarlo una vez con su respectivo Monto1 y Monto2. Que me quede así:

Código:
IdEmpresa    IdOficina IdOrdenCompra     Monto1	Monto2
2		7	1		50.0000	 0.00	
2		7	2	     	30.0000	50.00
2		7	3	     	10.0000	20.00
2		7	4	       	 0.0000	60.00
Ayuda porfa
  #2 (permalink)  
Antiguo 09/04/2007, 17:18
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Re: oTRO select feo

Tendrias que especificar un poco mas la lógica de tu filtrado, y que valores puede tener, también si va a haber mas de una ocurrencia de un registro en cualquierda de las dos tablas.

Como yo lo veo así rápido, una tabla siempre tendrá un monto1 de 0 y monto2 mayor que 0, y la otra al revés, y de lo que se trata es hacer un JOIN. Si esto es cierto con un simple IF te basta:

Código:
SELECT a.campo1, a,campo2, a.campo3,
(CASE WHEN a.campo4 = 0 THEN (SELECT...) ELSE (SELECT...) END) AS monto1,
(CASE WHEN b.campo5 = 0 THEN (SELECT...) ELSE (SELECT...) END) AS monto2,
 FROM tbl_a a INNER JOIN tbl_b b ON
a.campo1 = b.campo1 AND a.campo2 = b.campo2 AND a.campo3 = b.camp02
No se, algo asi, pero de nuevo necesitarias ser mas explicito.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 10/04/2007, 08:04
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: oTRO select feo

Hola amigo golman, gracias por contestar. Es así como tu lo piensas, un registro puede estar en ambas tablas o solamente en una de las dos. Y en la primera tabla temporal Monto2 siempres será cero y en la segunda Monto1 siempre será cero.

No puedo hacer inner join porque solo tomaría los registros cuya clave primarias se encuentran en las dos tablas. En el ejemplo que puse solo serían los registros con IdOrdenCompra 2 y 3. Pero tambien quiero el registro con IdOrdenCompra=1 (de la primera tabla temporal) Y también el registro con IdOrdenCompra=4 (de la segunda tabla temporal)

La cosa es que si se el registro se encuentra en ambas tablas temporales debe registrarse una sola vez en la tabla termporal final tomando el valor Monto1 de la primera tabla temporal y Monto2 de la segunda tabla temporal.

Si el registro solo se encuentra en la primera tabla temporal debe registrarse en la tabla temporal final con su respectivo valor Monto1, y en el Monto2 le pongo cero

Y si el registro solo se encuentra en la segunda tabla temporal debe registrarse en la tabla temporal final con su respectivo valor Monto2, y en el Monto1 le pongo cero

Ahora si ta mas explicadito

Estaba revisando por aquí por el foro y creo que la cosa va por left o rigth outer join pero no entiendo exactamente su concepto
  #4 (permalink)  
Antiguo 10/04/2007, 09:47
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: oTRO select feo

Espero te sirva....

Código:
If object_id('tempdb..#tmp1') is not null drop table #tmp1
If object_id('tempdb..#tmp2') is not null drop table #tmp2

Create table #tmp1 (IdEmpresa int, IdOficina int, IdOrdenCompra int, Monto1 float, Monto2 float)
Create table #tmp2 (IdEmpresa int, IdOficina int, IdOrdenCompra int, Monto1 float, Monto2 float)


insert into #tmp1 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,1,50, 0)
insert into #tmp1 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,2,30, 0)
insert into #tmp1 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,3,10, 0)


insert into #tmp2 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,2,0, 50)
insert into #tmp2 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,3,0, 20)
insert into #tmp2 (IdEmpresa, IdOficina, IdOrdenCompra, Monto1, Monto2) values(2,7,4,0, 60)


Select isnull(U.IdEmpresa,     D.IdEmpresa)     IdEmpresa
      ,isnull(U.IdOficina,     D.IdOficina)     IdOficina
      ,isnull(U.IdOrdenCompra, D.IdOrdenCompra) IdOrdenCompra
      ,Case When U.IdEmpresa is null Then D.Monto1 Else U.Monto1 End    Monto1
      ,Case When D.IdEmpresa is null Then U.Monto2 Else D.Monto2 End    Monto2
From   #tmp1  U
Full outer join
       #tmp2  D
On     U.IdEmpresa     = D.IdEmpresa      And
       U.IdOficina     = D.IdOficina      And
       U.IdOrdenCompra = D.IdOrdenCompra
Order by
      IdEmpresa
     ,IdOficina
     ,IdOrdenCompra
 


IdEmpresa   IdOficina   IdOrdenCompra Monto1  Monto2                                                
----------- ----------- ------------- ------- ------------
2           7           1             50.0    0.0
2           7           2             30.0    50.0
2           7           3             10.0    20.0
2           7           4             0.0     60.0

(4 row(s) affected)
__________________
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 10/04/2007, 11:53
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Re: oTRO select feo

Yo que venia con la firme idea de pelearme con este query, lo bueno es que siempre se consigue ayuda por acá.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #6 (permalink)  
Antiguo 10/04/2007, 13:15
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: oTRO select feo

Gracias Andres y golman Si tuviera reputación verde ya les hubiese puntuado a la de ustedes

Gracias, me tocará aprender bien la teoría del FULL OUTER JOIN
  #7 (permalink)  
Antiguo 12/04/2007, 13:09
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: oTRO select feo

Usando subquerys también puedes lograrlo:

SELECT IdEmpresa, IdOficina, IdOrdenCompra, SUM(Monto1), SUM(Monto2)
FROM(
SELECT * FROM #Temp1
UNION ALL
SELECT * FROM #Temp2
) temp
GROUP BY IdEmpresa, IdOficina, IdOrdenCompra
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 12/04/2007, 14:02
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: oTRO select feo

Eje!! cada vez la estoy viendo mas simplificada

Gracias Mith
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 07:16.