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

[SOLUCIONADO] Union me repite Datos

Estas en el tema de Union me repite Datos en el foro de SQL Server en Foros del Web. Que tal, un saludo a todos!! Bien. Tengo una consulta que me retorna los valores de salidas y entradas de un almacén, las entradas y ...
  #1 (permalink)  
Antiguo 25/08/2014, 15:59
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Union me repite Datos

Que tal, un saludo a todos!!

Bien. Tengo una consulta que me retorna los valores de salidas y entradas de un almacén,
las entradas y salidas están en distintas tablas entonces al hacer la unión, si un producto tuvo dos entradas en esa fecha pero en distinto almacén, efectivamente me pone las dos entradas pero también me pone las dos salidas cuando solo hubo una salida en un almacén, entonces en lugar de poner el otro almacén con cero salidas, lo que hace es copiar la salida del otro, no se que puedo hacer para q me ponga cero si es que no tiene salida, y supongo que si pasara lo contrario también me copiaría las entradas.

Muchas Gracias :D
  #2 (permalink)  
Antiguo 25/08/2014, 16:09
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

puedes poner tu query? y algunos datos de ejemplo???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 25/08/2014, 16:13
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Código SQL:
Ver original
  1. SELECT t3.Codigo,nickname,isnull(Entradas,0) Entradas,isnull(Salidas,0) Salidas,isnull(Entradas,0)-isnull(Salidas,0) Total--,isnull(Entradas,0)-isnull(SAlidas,0) as total
  2. FROM(
  3. SELECT EntradasMP.Codigo,Nickname,SUM(cantidad) Entradas--,isnull(convert(char(11),fecha,111),'N/D')as fecha
  4. FROM EntradasMP INNER JOIN [Datos Empresa] ON EntradasMP.idEmpresa=[Datos Empresa].idEmpresa
  5. WHERE EntradasMP.Codigo BETWEEN '004-1113' AND '004-1113'  AND fecha BETWEEN '2014-05-03' AND '2014-08-21' GROUP BY EntradasMP.codigo,nickname
  6. --ORDER BY EntradasMP.codigo--,fecha
  7.  ) AS t3
  8. LEFT JOIN(
  9. SELECT SUM(cantidad) Salidas,SalidasMP.codigo--,Nickname
  10. FROM SalidasMP INNER JOIN [Datos Empresa] ON SalidasMP.idEmpresa=[Datos Empresa].idEmpresa
  11. WHERE SalidasMP.Codigo BETWEEN '004-1113' AND '004-1113' AND fecha BETWEEN '2014-05-03' AND '2014-08-21' GROUP BY SalidasMP.Codigo,nickname-- ORDER BY SalidasMP.Codigo
  12. ) AS t4 ON (t3.codigo=t4.codigo) ORDER BY t3.codigo

y el resultado es:

codigo Almacén Entradas Salidas Total
004-1113 uno 406.00 411.5865 -5.5865
004-1113 dos 5223.39 411.5865 4811.8035


almacén uno esta correcto pero el dos no tiene salidas en ese rango de fechas y pone las mismas salidas q en almacén uno :/
  #4 (permalink)  
Antiguo 25/08/2014, 16:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

Eso no es un join estas haciendo un subquery, ahora dices que estas sobre la misma fecha correcto??? ahora porque no agregas la fecha en tu query??? si quieres que aparezca separado por fechas....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 25/08/2014, 16:25
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Es que lo que quiero es sacar solo esos datos que serian el total en los almacenes y así sumarlos, porque si pongo la fecha me muestra todas las entradas y salidas del rango de fechas, y así solo me muestra la suma de entradas y salidas en ese rango.
  #6 (permalink)  
Antiguo 25/08/2014, 16:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

un ejemplo de tu raw data seria mejor para ayudarte a armar el query porque asi no alcanzo a notar donde esta el issue
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 26/08/2014, 09:22
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Perdón ayer no pude contestar.. La consulta me devuelve los datos que quiero el problema es que si hay mas entradas que salidas o viceversa, me copia los campos, como se ve en el ejemplo almacén uno tiene salidas pero el almacén dos no, pero, como los dos tienen entradas me pone la salida del almacén uno en el dos, como para no dejarlo vacío me imagino yo, no se la verdad que sea o que este haciendo mal!!
  #8 (permalink)  
Antiguo 26/08/2014, 12:07
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

Entiendo donde tienes el problema y mas o menos donde esta la solucion, pero sin ver tus datos no puedo ayudarte, aqui lo que veo es que estas haciendo un producto cartesiano al unir tus 2 consultas por medio del cmapo codigo, necesitarias hacer mas especifico el join para que retorne lo que necesitas o en su defecto usar alguna funcion de agregacion para que queden tus datos como los necesitas :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 26/08/2014, 14:02
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Es lo que he estado investigando, el producto cartesiano, vi que es con el CROSS JOIN pero ni idea de como me pueda ayudar si se supone que arroja el total de registros de las tablas seleccionadas, no entiendo como lo puedo usar... D:
  #10 (permalink)  
Antiguo 26/08/2014, 14:07
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

nada que ver.......tienes informacion repetida que te esta dando valores duplicados, pasame un ejemplo de tu "raw data" con 5 registros para cada query que hace sy te puedo ayudar de lo contrario aqui nos vamos a seguir.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 26/08/2014, 15:10
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Código SQL:
Ver original
  1. CREATE TABLE Entradas(idTienda CHAR(2),Codigo CHAR(12),Fecha smalldatetime,idAlmacen CHAR(2),Cantidad money)
  2. CREATE TABLE Salidas(idTienda CHAR(2),Codigo CHAR(12),Fecha smalldatetime,idAlmacen CHAR(2),Cantidad money)
  3. CREATE TABLE datEmp (idTienda CHAR(2),nickname nvarchar(20))
  4.  
  5. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'04',325.34)
  6. INSERT INTO Entradas VALUES ('01','004-113',GETDATE(),'01',400.4)
  7. INSERT INTO Entradas VALUES ('01','004-113',GETDATE(),'01',1200.77)
  8. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'01',325)
  9. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'04',238.01)
  10.  
  11. INSERT INTO datEmp VALUES ('08','tienda8')
  12. INSERT INTO datEmp VALUES ('01','tienda8')
  13. INSERT INTO datEmp VALUES ('02','tienda2')
  14. INSERT INTO datEmp VALUES ('09','tienda9')
  15. INSERT INTO datEmp VALUES ('07','tienda7')
  16.  
  17. INSERT INTO Salidas VALUES ('08','004-113',GETDATE(),'04',25.04)
  18. INSERT INTO Salidas VALUES ('01','004-113',GETDATE(),'01',10.50)
  19. INSERT INTO Salidas VALUES ('02','004-113',GETDATE(),'01',600.17)
  20. INSERT INTO Salidas VALUES ('09','004-113',GETDATE(),'01',35.04)
  21. INSERT INTO Salidas VALUES ('08','004-113',GETDATE(),'04',33.01)

A ver si esto sirve un poco.
  #12 (permalink)  
Antiguo 26/08/2014, 15:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

Eso que le cuesta :), aqui un aproach del query, te dije que le faltaban condiciones ;)

Código SQL:
Ver original
  1. CREATE TABLE Entradas(idTienda CHAR(2),Codigo CHAR(12),Fecha smalldatetime,idAlmacen CHAR(2),Cantidad money)
  2. CREATE TABLE Salidas(idTienda CHAR(2),Codigo CHAR(12),Fecha smalldatetime,idAlmacen CHAR(2),Cantidad money)
  3. CREATE TABLE datEmp (idTienda CHAR(2),nickname nvarchar(20))
  4.  
  5. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'04',325.34)
  6. INSERT INTO Entradas VALUES ('01','004-113',GETDATE(),'01',400.4)
  7. INSERT INTO Entradas VALUES ('01','004-113',GETDATE(),'01',1200.77)
  8. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'01',325)
  9. INSERT INTO Entradas VALUES ('08','004-113',GETDATE(),'04',238.01)
  10.  
  11.  
  12. INSERT INTO datEmp VALUES ('08','tienda8')
  13. INSERT INTO datEmp VALUES ('01','tienda1')
  14. INSERT INTO datEmp VALUES ('02','tienda2')
  15. INSERT INTO datEmp VALUES ('09','tienda9')
  16. INSERT INTO datEmp VALUES ('07','tienda7')
  17.  
  18. INSERT INTO Salidas VALUES ('08','004-113',GETDATE(),'04',25.04)
  19. INSERT INTO Salidas VALUES ('01','004-113',GETDATE(),'01',10.50)
  20. INSERT INTO Salidas VALUES ('02','004-113',GETDATE(),'01',600.17)
  21. INSERT INTO Salidas VALUES ('09','004-113',GETDATE(),'01',35.04)
  22. INSERT INTO Salidas VALUES ('08','004-113',GETDATE(),'04',33.01)
  23.  
  24.  
  25.  
  26. SELECT * FROM(
  27. SELECT t1.codigo,t2.nickname,SUM(cantidad) AS entradas
  28. --*
  29. FROM Entradas AS t1
  30. LEFT JOIN datEmp AS t2 ON (t1.idtienda=t2.idTienda)
  31. --where t1.codigo between '004-113' AND '004-113' and t1.fecha BETWEEN '2014-05-03' AND '2014-08-21'
  32. GROUP BY t1.codigo,t2.nickname
  33. ) AS t1 RIGHT JOIN
  34.  
  35. (
  36. SELECT t1.codigo,t2.nickname,SUM(cantidad) AS salidas FROM salidas AS t1
  37. LEFT JOIN datEmp AS t2 ON (t1.idtienda=t2.idTienda)
  38. --where t1.codigo between '004-113' AND '004-113' and t1.fecha BETWEEN '2014-05-03' AND '2014-08-21'
  39. GROUP BY t1.codigo,t2.nickname) AS t2 ON (t1.codigo=t2.codigo AND t1.nickname=t2.nickname)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 26/08/2014, 15:43
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

ooooohhhh!!!.. Cierto.. muchas gracias.. Me has sacado del apuro :P
  #14 (permalink)  
Antiguo 28/08/2014, 15:08
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Union me repite Datos

Hola a todos!

Sigo con un problema de union o producto cruz ya no se que es.
Lo que quiero es unir dos tablas salidas y entradas, en las salidas tengo tres registros y en las entradas tengo siete, bien, si hago un "union all" me las une sin problemas pero lo que yo quiero es que me las divida, dejo el query separado y resultados para darme a enteder un poco mas.
Código SQL:
Ver original
  1. SELECT DoctoSalida,Fecha,Cantidad FROM SalidasMP WHERE codigo='043-1032' AND fecha BETWEEN '2014-08-01' AND '2014-08-27' AND IdEmpresa='03' AND IdAlmacen='01'
  2.  
  3. SELECT DoctoEntrada,Fecha,Cantidad FROM EntradasMP WHERE codigo='043-1032' AND fecha BETWEEN '2014-08-01' AND '2014-08-27' AND IdEmpresa='03' AND IdAlmacen='01'

La primera me devuelve esto:
Docto salida: Fehca Cantidad
1 2014-08-04 21
2 2014-08-06 13
3 2014-08-07 15
4 2014-08-11 02
5 2014-08-22 77
6 2014-08-25 21
7 2014-08-27 17

La segunda esto:

Docto entrada: Fehca Cantidad
1 2014-08-05 21
2 2014-08-25 13

(Las cantidades y doctos son ficticios)

entonces lo que yo quiero q muestre es algo mas o menos asi

Docto salida: Docto entrada Fehca CantidadS CantidadE
1 -- 2014-08-04 21 0
-- 1 2014-08-05 0 21
2 -- 2014-08-06 13 0
3 -- 2014-08-07 15 0
4 -- 2014-08-11 02 0
5 -- 2014-08-22 77 0
6 2 2014-08-25 21 13
7 -- 2014-08-27 17 0


Espero me puedan ayudar..
  #15 (permalink)  
Antiguo 28/08/2014, 15:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

Código SQL:
Ver original
  1. SELECT CASE WHEN isnull(t1.cantidad,0)>0 THEN cantidad ELSE 0 END AS entradas,
  2. CASE WHEN isnull(t2.cantidad,0)>0 THEN cantidad ELSE 0 END AS salidas
  3. FROM (
  4. SELECT DoctoSalida,Fecha,Cantidad FROM SalidasMP WHERE codigo='043-1032' AND fecha BETWEEN '2014-08-01' AND '2014-08-27' AND IdEmpresa='03' AND IdAlmacen='01'
  5.  ) AS t1 LEFT JOIN(
  6. SELECT DoctoEntrada,Fecha,Cantidad FROM EntradasMP WHERE codigo='043-1032' AND fecha BETWEEN '2014-08-01' AND '2014-08-27' AND IdEmpresa='03' AND IdAlmacen='01') AS t2 ON (t1.doctoentrada=t2.doctoentrada)

y asi tednrias lo que quieres ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 28/08/2014, 15:23
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Lo que me hace es poner todas las salidas en 0, y me muestra 7 registros cuando deberian ser 9 :(
  #17 (permalink)  
Antiguo 28/08/2014, 15:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. docto INT,
  4. fecha datetime,
  5. cantidad INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1,'2014-08-04',21)
  9. INSERT INTO #temp VALUES (2,'2014-08-06',13)
  10. INSERT INTO #temp VALUES (3,'2014-08-07',15)
  11. INSERT INTO #temp VALUES (4,'2014-08-11',02)
  12. INSERT INTO #temp VALUES (5,'2014-08-22',77)
  13. INSERT INTO #temp VALUES (6,'2014-08-25',21)
  14. INSERT INTO #temp VALUES (7,'2014-08-27',17)
  15.  
  16. CREATE TABLE #temp2
  17. (
  18. docto INT,
  19. fecha datetime,
  20. cantidad INT
  21. )
  22. INSERT INTO #temp2 VALUES (1,'2014-08-05',21)
  23. INSERT INTO #temp2 VALUES (2,'2014-08-25',13)
  24.  
  25. SELECT docto,fecha,cantidad AS salida,0 AS entrada FROM #temp
  26. UNION
  27. SELECT docto,fecha,0 AS salida,cantidad AS entrada FROM #temp2

algo asi??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #18 (permalink)  
Antiguo 28/08/2014, 15:44
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Si algo asi, solo que tu pones en las dos talas el campo entrada y salida y yo solo tengo uno en cada uno entonces si hago la union solo me los va poniendo uno abajo del otro..
  #19 (permalink)  
Antiguo 28/08/2014, 15:57
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

o no se si con el union exista un forma de identificar los registros de las tablas, osea saber que registro es de que tabla de las que uní? si puedo diferenciar eso puedo acomodarlos como yo quiera.
  #20 (permalink)  
Antiguo 28/08/2014, 15:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Union me repite Datos

o sea queeeeeeeeeeeeeeeeeeee?? no has revisado mi query verdad??? estoy usando tus mismos datos solo que los estoy acomodando como tu los necesitas, si te fijas en la estructura de las tablas estas solo tienen 3 campos

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. docto INT,
  4. fecha datetime,
  5. cantidad INT
  6. )
  7.  
  8. CREATE TABLE #temp2
  9. (
  10. docto INT,
  11. fecha datetime,
  12. cantidad INT
  13. )

y mi resultado son 4 campos, como le hago?? sencillo pones un 0 como valor default y le pones el nombre que quieras algo asi:
Código SQL:
Ver original
  1. SELECT docto,fecha,cantidad AS salida,0 AS entrada FROM #temp

si te fijas el campo cantidad lo llamo salida(que es el que trae info) y el 0 lo llamo entrada(es el que no trae info)..

entendiste?????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #21 (permalink)  
Antiguo 28/08/2014, 16:10
 
Fecha de Ingreso: junio-2014
Ubicación: D.F.
Mensajes: 42
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Union me repite Datos

Dios de mi vida.. Que vergüenza acabo de pasar.. Disculpame no se en que planeta ando.. Muchas gracias de verdad eso era eso era...Perdón una vez mas ando en las nuves XD... Lo siento...

GRACIAS.. Siempre me sacas de apuros :P

Etiquetas: query, repite, select, tabla, union
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:11.