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

Duda con esta consulta

Estas en el tema de Duda con esta consulta en el foro de SQL Server en Foros del Web. Hola como va?? Tengo problemas con una consulta, a ver si alguien me puede ayudar Tengo 2 tablas, una de Movimientos de stock y otra ...
  #1 (permalink)  
Antiguo 29/07/2013, 15:03
 
Fecha de Ingreso: octubre-2012
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Duda con esta consulta

Hola como va??

Tengo problemas con una consulta, a ver si alguien me puede ayudar
Tengo 2 tablas, una de Movimientos de stock y otra de TipoDeMovimiento

Mov stock: articulo, deposito, fecha, tipoMov
TipoDeMovimiento: id, signo

Si ejecuto lo siguiente:
Código SQL:
Ver original
  1. SELECT sd.articulo, sd.mdeposito, (SELECT SM.signo FROM tipomovimiento SM WHERE SM.id=SD.tipomovimiento) AS Signo,
  2. (SELECT sd.cantidad * (SELECT SM.signo FROM tipomovimiento SM WHERE SM.id=SD.tipomovimiento)) AS CantidadMultiplicada
  3. FROM movimientostock sd
  4. WHERE sd.articulo=51 AND sd.deposito=17 AND YEAR(sd.fecha)=2013 AND MONTH(sd.fecha)=1
  5. GROUP BY  sd.articulo, sd.deposito, YEAR(sd.fecha), MONTH(sd.fecha), sd.tipomovimiento, sd.cantidad
Obtengo

Arti Depo Signo CantidadMultiplicada (ya traigo multiplicada por su factor digamos, tal vez no sirve de nada igual esto que hago y es mas util case)

51 17 1 2.00
51 17 1 1.00
51 17 -1 -1.00

Querria obtener UN UNICO REGISTRO asi

51 17 1 2.00 (pues es 2+1-1)

La idea seria agrupar cantidades de un deposito de un articulo POR MES y TENIENDO EN CUENTA el movimiento que tuvo (algunas cantidades se sumarian en el sum con un *1 y otras con un *-1)

Es con sum pero no entiendo como hacerlo.

Resumiendo
Si tengo
Articulo Depo Cant Mes (signo en la otra tabla)
1 1 10 3 -1
1 1 15 3 -1
1 1 20 4 1
1 2 15 6 1
2 2 12 6 1
2 3 12 7 1
2 3 15 7 -1

Quiero algo que me devuelva
Articulo Depo Cantidad Mes
1 1 -25 3 ----- pues hace -10 -15 = -25
1 1 20 4
1 2 15 6
2 2 12 6
2 3 '-3 7 ----- pues hace 12 - 15 = -3


GRACIAS!

Última edición por gnzsoloyo; 29/07/2013 a las 16:19
  #2 (permalink)  
Antiguo 29/07/2013, 15:28
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duda con esta consulta

con los datos que mencionas puedes hacer esto :)

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. articulo INT,
  4. depo INT,
  5. cant INT,
  6. mes INT,
  7. signo INT
  8. )
  9.  
  10. INSERT INTO #temp VALUES (1,1 ,10, 3, -1)
  11. INSERT INTO #temp VALUES (1, 1, 15, 3, -1)
  12. INSERT INTO #temp VALUES (1, 1, 20, 4, 1)
  13. INSERT INTO #temp VALUES (1, 2, 15, 6, 1)
  14. INSERT INTO #temp VALUES (2, 2, 12, 6, 1)
  15. INSERT INTO #temp VALUES (2, 3, 12, 7, 1 )
  16. INSERT INTO #temp VALUES (2, 3, 15, 7, -1)
  17.  
  18. SELECT articulo,depo,mes,SUM(cantidad) AS total FROM(
  19. SELECT articulo,depo,mes,(cant*signo) AS cantidad FROM #temp) AS t1 GROUP BY articulo,depo,mes

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 29/07/2013, 17:19
 
Fecha de Ingreso: octubre-2012
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Duda con esta consulta

Mmm si lo que pasa es que en realidad el signo ese yo me lo traje, pero la idea es que ese join con la otra tabla este en la misma consulta

Osea a partir de las 2 tablas que puse, que devuelva
1 registro agrupado por mes, articulo y deposito, con la cantidad (que pueden ser varias, y se sacara un sum multiplicando por o no -1 segun ese select con la otra tabla)
Seria como implementar algo del estilo
(CASE WHEN (select signo from tabla2 where tabla2.id=tabla1.tipomov)=1) then tabla1.cantidad ELSE tabla1.cantidad*-1 END) en mi cosnulta principal, pero me da errores de agreggate functions y demas

Lo podes resolver con algo de eso que puse? tiene sentido?
gracias y disculpas!
  #4 (permalink)  
Antiguo 29/07/2013, 17:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duda con esta consulta

si pones los datos de tus tablas puede ser que lo resuelva :P si no ni como adivinarlo....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 29/07/2013, 18:07
 
Fecha de Ingreso: octubre-2012
Mensajes: 8
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Duda con esta consulta

jajaja dale gracias! :P

Movstocks:
id_mov, fecha, depo_mov, arti_mov, cant, tipomov
1 2013-06-23 00:00:00 1 1 5 1
2 2013-06-23 00:00:00 1 1 1 2
3 2013-06-23 00:00:00 1 1 3 3
4 2013-06-23 00:00:00 1 1 10 4
5 2013-07-21 00:00:00 2 1 3 5
6 2013-06-22 00:00:00 3 1 5 4
7 2013-07-30 00:00:00 1 2 4 3
8 2013-06-23 00:00:00 2 2 1 4
9 2013-07-23 00:00:00 3 2 1 4
10 2013-06-25 00:00:00 1 3 2 3
11 2012-06-24 00:00:00 1 1 3 2
12 2012-06-24 00:00:00 1 1 5 4
13 2012-06-24 00:00:00 1 1 1 2
....

TipoMovimiento:
id_tipo, factor, desc
1 1 ingreso stock
2 -1 egreso produccion
3 -1 egreso stock
4 1 ingreso produccion
5 -1 egreso venta

(las descripciones no importan, interesan los 5 id (no solo stock) y ver si es 1 o -1)

Resultado que espero obtener


Articulo, Deposito, Mes, Anio, Cantidad
1 1 6 2013 11 ( pues serian 5-1-3+10 )
1 2 7 2013 -3 ( pues solo es un 3 x su factor -1)
2 1 7 2013 -4
......
......
1 1 6 2012 1 (pues es -3+5-1)

Osea, traer por mes de cada año, el articulo, su deposito, y sus cantidades (sumadas o restadas segun sus movimientos)

Si hago una consulta de este estilo, me devuelve lo que quiero pero sin este jueguito de los movimientos que ME FALTA AGREGARLE ACA SOLO ESTOY SUMANDO CANTIDADES, nunca pregunte por lo del tipo de movimiento y sume o reste, pero esa seria la consulta a la cual falta agregarle esto)

select MV.arti_mov, MV.depo_mov, month(MV.fecha), sum(MV.cant) as cantidad
from movstocks MV
group by month(MV.fecha), MV.depo_mov, MV.arti_mov
order by 1 asc, 2 asc, 3 desc

Última edición por lugue2011; 29/07/2013 a las 18:13
  #6 (permalink)  
Antiguo 30/07/2013, 07:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duda con esta consulta

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id_mov INT,
  4. fecha datetime,
  5. depo_mov INT,
  6. arti_mov INT,
  7. cant INT,
  8. tipomov INT
  9. )
  10.  
  11.  
  12. INSERT INTO #temp VALUES (1,'2013-23-06 00:00:00',  1,  1,  5, 1)
  13. INSERT INTO #temp VALUES (2,'2013-23-06 00:00:00',1,    1,  1, 2)
  14. INSERT INTO #temp VALUES (3,'2013-23-06 00:00:00',1,    1,  3, 3)
  15. INSERT INTO #temp VALUES (4,'2013-23-06 00:00:00',1,    1, 10, 4)
  16. INSERT INTO #temp VALUES (5,'2013-21-07 00:00:00',2,    1, 3, 5)
  17. INSERT INTO #temp VALUES (6,'2013-22-06 00:00:00',3,    1,  5, 4)
  18. INSERT INTO #temp VALUES (7,'2013-30-07 00:00:00',1,    2,  4, 3)
  19. INSERT INTO #temp VALUES (8,'2013-23-06 00:00:00',2,    2,  1, 4)
  20. INSERT INTO #temp VALUES (9,'2013-23-07 00:00:00',3,    2,  1, 4)
  21. INSERT INTO #temp VALUES (10,'2013-25-06 00:00:00',1,   3,  2, 3)
  22. INSERT INTO #temp VALUES (11,'2012-24-06 00:00:00',1,   1,  3, 2)
  23. INSERT INTO #temp VALUES (12,'2012-24-06 00:00:00',1,   1,  5, 4)
  24. INSERT INTO #temp VALUES (13,'2012-24-06 00:00:00', 1,  1,  1, 2)
  25.  
  26.  
  27.  
  28. --drop table #temp2
  29. CREATE TABLE #temp2
  30. (
  31. id_tipo INT,
  32. factor INT
  33. )
  34.  
  35. INSERT INTO #temp2 VALUES (1, 1)
  36. INSERT INTO #temp2 VALUES (2, -1)
  37. INSERT INTO #temp2 VALUES (3, -1)
  38. INSERT INTO #temp2 VALUES (4, 1 )
  39. INSERT INTO #temp2 VALUES (5, -1)
  40.  
  41. SELECT mes,[año],depo_mov,arti_mov,SUM(factor) total FROM(
  42. SELECT datepart(mm,fecha) AS mes, datepart(yyyy,fecha) AS [año],depo_mov,arti_mov,(cant*factor) AS factor FROM #temp AS t1
  43. LEFT JOIN #temp2 AS t2 ON (t1.tipomov=t2.id_tipo)) t1 GROUP BY mes,[año],depo_mov,arti_mov
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: registro, select, tabla
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 22:55.