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

Dilema con consulta

Estas en el tema de Dilema con consulta en el foro de SQL Server en Foros del Web. Hola buenas tardes, bueno no se como explicar lo que requiero pero trataré. Tengo la siguiente consulta con 5 campos en sql server 2008 con: ...
  #1 (permalink)  
Antiguo 02/05/2011, 16:40
 
Fecha de Ingreso: mayo-2011
Mensajes: 9
Antigüedad: 13 años, 6 meses
Puntos: 1
Dilema con consulta

Hola buenas tardes, bueno no se como explicar lo que requiero pero trataré. Tengo la siguiente consulta con 5 campos en sql server 2008 con: un producto, una cantidad solicitada por un cliente y una existencia en bodegas (1 y 2)


PRODUCTO- CANT_PEDIDO - BODEGA_1- BODEGA_2-

silla 3 10 4
mesa 5 20 90
pelota 0 409 0
plato 2 120 18
cama 600 409 234
carro 239 189 0
botella 150 98 0
vaso 115 15 8


Lo que me piden hacer es una consulta con solo 3 campos, 'producto' un unico campo 'cantidad' llamado 'cantidad_general' en donde reposen los datos de las bodegas y el de pedido y un tercer campo 'desc_cantidad' donde diga si es un pedido o de una bodega, asi:

PRODUCTO CANTIDAD DESC_CANTIDAD

silla 3 PEDIDO
silla 10 BODEGA1
silla 4 BODEGA2
mesa 5 PEDIDO
mesa 20 BODEGA1
mesa 90 BODEGA2
pelota 0 PEDIDO
pelota 409 BODEGA1
pelota 0 BODEGA2

y no he podido hacerlo, se que hay una forma mas optima de mostrar esta consulta pero mi jefe la requiere asi por lo que no tengo opción.... agradezco cualquier ayuda, pues me va a volver loco.......... ...... gracias por la atención prestada.....
  #2 (permalink)  
Antiguo 02/05/2011, 16:48
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Dilema con consulta

Danos un poco más de información sobre como están organizadas las tablas en la base de datos para poder ayudarte.
  #3 (permalink)  
Antiguo 02/05/2011, 18:13
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Dilema con consulta

De acuerdo, con tan pocos datos, pues es como jugar a las adivinanzas, ¿como sabes que es un PEDIDO, como decides por BODEGA1 o BODEGA2?
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 02/05/2011, 21:54
 
Fecha de Ingreso: mayo-2011
Mensajes: 9
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Dilema con consulta

Gracias muchachos por responder bueno aqui les explico:

el producto y la cantidad lo saco de la tabla pedidos que tiene como llave principal id_producto, las bodegas salen de unas funciones de la misma tabla, es decir

CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),MO NTH(GETDATE()),B.PRODUCTO,'01','T','C') AS DECIMAL) BODEGA_01 ----funcion bodega 1

CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),MO NTH(GETDATE()),B.PRODUCTO,'02','T','C') AS DECIMAL)BODEGA_02 ----funcion bodega 2

estas funciones me traen el numero de x producto que tengo en x bodegas, en este caso bodega 1 y 2, de la misma tabla, pero me las trae como campos (columnas) y los necesito como registros en el campo de cantidad.

ESTE EL CODIGO ORIGINAL, es un tanto mas complejo por eso puse el ejemplo anterior para que se entendiera mejor. Pues aqui junto tres tablas 'MTMERCIA' donde estan todos los productos y 'TRADE' (pedidos) que junto con 'MVTRADE' (detalle de pedido) contienen los pedidos hechos por los clientes

*/

SELECT
E.DESCRIPCIO AS PRODUCTO,CAST(CASE WHEN LEN(B.PRODUCTO)=6 THEN (B.CANTIDAD)/ISNULL((SELECT MTMERCIA.UNIDADMED FROM MTMERCIA
WHERE MTMERCIA.CODIGO = CASE WHEN LEN(B.PRODUCTO)=6 THEN SUBSTRING(B.PRODUCTO,1,5) ELSE B.PRODUCTO END),'1') ELSE (B.CANTIDAD) END AS DECIMAL)CANTIDAD_CAJA
,CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),M ONTH(GETDATE()),B.PRODUCTO,'01','T','C') AS DECIMAL) BODEGA_01
,CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),M ONTH(GETDATE()),B.PRODUCTO,'69','T','C') AS DECIMAL)BODEGA_69
FROM MVTRADE B INNER JOIN TRADE C ON B.ORIGEN=C.ORIGEN AND B.TIPODCTO=C.TIPODCTO AND B.NRODCTO=C.NRODCTO
INNER JOIN MTMERCIA E ON B.PRODUCTO = E.CODIGO

WHERE B.TIPODCTO = 'PD'

/*

Pero esta consulta me arroja el resultado con el primer formato que les mostré anteriormente y lo nesecito del segundo formato, no se como reorganizarl la consulta de tal forma que me quede de esa manera..... HELP.....!!!!!!!!
  #5 (permalink)  
Antiguo 03/05/2011, 12:44
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Dilema con consulta

En verdad que no se me viene a la cabeza ninguna solucion, excepto (tendrias que probar su rendimiento), que llenaras una tabla temporal con los datos que obtienes de la consultas sin las FUNCIONES.

Despues, mediante un WHILE ( BUCLE ), recorrieras dicha tabla, para ejecutar tus 2 funciones y con dicho resultado, INGRESAR (insert) 2 registros mas a dicha tabla (con otro tipo de registro), hasta completar todos los de la primera consulta.

Finalmente, le das un simple select a tu tabla temporal, cuando esta haya sido llenada con todos los datos.
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 03/05/2011, 15:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Dilema con consulta

Hola jahireffer:

Creo que hay una manera de hacer lo que necesitas, con UNION's, pero no sé que tanto le pueda afectar en el rendimiento al servidor, la consulta es bastante repetitiva, pero igual y te puede funcionar, sería más o menos así:

Código SQL:
Ver original
  1. DECLARE @tabla TABLE (PRODUCTO VARCHAR(20), CANT_PEDIDO INT, BODEGA_1 INT, BODEGA_2 INT)
  2. INSERT INTO @tabla VALUES ('silla', 3, 10, 4)
  3. INSERT INTO @tabla VALUES ('mesa', 5, 20, 90)
  4. INSERT INTO @tabla VALUES ('pelota', 0, 409, 0)
  5. INSERT INTO @tabla VALUES ('plato', 2, 120, 18)
  6. INSERT INTO @tabla VALUES ('cama', 600, 409, 234)
  7. INSERT INTO @tabla VALUES ('carro', 239, 189, 0)
  8. INSERT INTO @tabla VALUES ('botella', 150, 98, 0)
  9. INSERT INTO @tabla VALUES ('vaso', 115, 15, 8)
  10.  
  11. SELECT * FROM @tabla
  12.  
  13. SELECT producto, cant_pedido cantidad, 'PEDIDO' desc_cantidad FROM @tabla
  14. UNION
  15. SELECT producto, bodega_1 cantidad, 'BODEGA1' desc_cantidad FROM @tabla
  16. UNION
  17. SELECT producto, bodega_2 cantidad, 'BODEGA2' desc_cantidad FROM @tabla

Por otra parte, creo que la consulta que pones se podría optimizas, sobre todo para la parte donde obtienes CANTIDAD_CAJA, ya que estás haciendo una subconsulta sobre la misma tabla MTMERCIA que tienes en tu INNER JOIN. deberías revisar también esa parte.

Saludos
Leo
  #7 (permalink)  
Antiguo 03/05/2011, 17:29
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Dilema con consulta

Leo

Una pequeñisima duda, ¿Donde quedo la funcion que el utiliza?
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 04/05/2011, 08:22
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Dilema con consulta

Iislas, la consulta que pude yo fue sólo un ejemplo de cómo poder hacerlo, ya que al no tener la estructura de las tablas, ni datos de ejemplos no tengo la posibilidad de hacer una prueba real. Si observas creo una variable tipo tabla e inserto los valores que se supone regresaría la consulta, de esta manera pude hacer algunas pruebas.

La consulta que debería probar jahireffer sería más o menos la siguiente:

Código SQL:
Ver original
  1. SELECT
  2. E.DESCRIPCIO AS PRODUCTO,
  3. CAST(
  4. CASE WHEN LEN(B.PRODUCTO)=6 THEN (B.CANTIDAD)/ISNULL((SELECT MTMERCIA.UNIDADMED FROM MTMERCIA
  5. WHERE MTMERCIA.CODIGO = CASE WHEN LEN(B.PRODUCTO)=6 THEN SUBSTRING(B.PRODUCTO,1,5) ELSE B.PRODUCTO END),'1') ELSE (B.CANTIDAD)
  6. END
  7. AS DECIMAL) AS CANTIDAD,
  8. 'PEDIDO' AS DESC_CANTIDAD
  9. FROM MVTRADE B INNER JOIN TRADE C ON B.ORIGEN=C.ORIGEN AND B.TIPODCTO=C.TIPODCTO AND B.NRODCTO=C.NRODCTO
  10. INNER JOIN MTMERCIA E ON B.PRODUCTO = E.CODIGO
  11. WHERE B.TIPODCTO = 'PD'
  12. UNION
  13. SELECT
  14. E.DESCRIPCIO AS PRODUCTO,
  15. CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),M ONTH(GETDATE()),B.PRODUCTO,'01','T','C') AS DECIMAL) AS CANTIDAD,
  16. 'BODEGA 1' AS DESC_CANTIDAD
  17. FROM MVTRADE B INNER JOIN TRADE C ON B.ORIGEN=C.ORIGEN AND B.TIPODCTO=C.TIPODCTO AND B.NRODCTO=C.NRODCTO
  18. INNER JOIN MTMERCIA E ON B.PRODUCTO = E.CODIGO
  19. WHERE B.TIPODCTO = 'PD'
  20. UNION
  21. SELECT
  22. E.DESCRIPCIO AS PRODUCTO,
  23. CAST(dbo.F_Saldo_Bodega_Informe(YEAR(GETDATE()),M ONTH(GETDATE()),B.PRODUCTO,'69','T','C') AS DECIMAL) AS CANTIDAD
  24. 'BODEGA 2' AS DESC_CANTIDAD
  25. FROM MVTRADE B INNER JOIN TRADE C ON B.ORIGEN=C.ORIGEN AND B.TIPODCTO=C.TIPODCTO AND B.NRODCTO=C.NRODCTO
  26. INNER JOIN MTMERCIA E ON B.PRODUCTO = E.CODIGO
  27. WHERE B.TIPODCTO = 'PD'
  28. ORDER BY 1

Repito que no es la manera más óptima de hacer una consulta, pero es cuestión que jahireffer haga algunas pruebas y nos comente si funciona o no.

Saludos
Leo.
  #9 (permalink)  
Antiguo 04/05/2011, 08:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Dilema con consulta

Gracias por el comentario
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 04/05/2011, 16:37
 
Fecha de Ingreso: mayo-2011
Mensajes: 9
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Dilema con consulta

Hola muchachos de nuevo gracias por responder, pues les cuento que mi jefe encontró la solucion y tiene que ver mucho con la idea y ejemplo de 'leonardo_josue', pues el realizó tres consultas y las unió con union all, aun no comprendo mucho la consulta pero ahi les va por si necesitan algo parecido, y si alguien me la puede explicar seria genial, de igual forma gracias muchachos y gracias leo:

Código:
SELECT '90001' AS ITEM
		,'860354511' AS NIT
		,'PH' AS CLIENTE
		,'SALDO' AS TIPO
		,'BOD1' AS NRO_PED
		,GETDATE() AS FECHA_PED
		,GETDATE() AS FECHA_ENT
		,dbo.F_Saldo_Bodega_Informe
					(YEAR(GETDATE()),MONTH(GETDATE()),'90001',01,'T','C') AS CANTIDAD_CAJA
UNION ALL
SELECT '90001' AS ITEM
		,'860354511' AS NIT
		,'PH' AS CLIENTE
		,'SALDO' AS TIPO
		,'BOD69' AS NRO_PED
		,GETDATE() AS FECHA_PED
		,GETDATE() AS FECHA_ENT
		,dbo.F_Saldo_Bodega_Informe
					(YEAR(GETDATE()),MONTH(GETDATE()),'90001',69,'T','C') AS CANTIDAD_CAJA
UNION ALL
SELECT A.CODIGO AS ITEM
		,'860354511' AS NIT
		,'PH' AS CLIENTE		
		,'SALDO' AS TIPO
		,'OE' AS NRO_PED 
		,GETDATE() AS FECHA_PED
		,GETDATE() AS FECHA_ENT
		,SUM (A.CANTPROD-A.CANTENTREG) AS CANTIDAD_CAJA
			 FROM RECEPROG A WHERE A.CODIGO= '90001' GROUP BY A.CODIGO
UNION ALL
SELECT SUBSTRING (B.PRODUCTO,1,5) AS ITEM
	--,E.DESCRIPCIO AS PRODUCTO
	,C.NIT AS NIT
	,D.NOMBRE AS CLIENTE
	,'PED' AS TIPO
	,C.NRODCTO AS NRO_PD
	,C.FECHA AS FECHA_PED
	,B.FECENT AS FECHA_ENT
	--,B.CANTIDAD
	,CAST(CASE
			WHEN LEN(B.PRODUCTO)=6 THEN (B.CANTIDAD)/
			ISNULL((SELECT MTMERCIA.UNIDADMED FROM MTMERCIA
			WHERE MTMERCIA.CODIGO = CASE
			WHEN LEN(B.PRODUCTO)=6 THEN SUBSTRING(B.PRODUCTO,1,5)
			ELSE B.PRODUCTO
			END
			),'1')	
			ELSE (B.CANTIDAD)
			END AS DECIMAL)CANTIDAD_CAJA
	 FROM MVTRADE B INNER JOIN TRADE C ON B.ORIGEN=C.ORIGEN AND B.TIPODCTO=C.TIPODCTO AND B.NRODCTO=C.NRODCTO
					INNER JOIN MTPROCLI D ON C.NIT = D.NIT
					INNER JOIN MTMERCIA E ON B.PRODUCTO = E.CODIGO 
	 WHERE B.TIPODCTO = 'PD' AND B.PRODUCTO = '90001'AND B.FECHA BETWEEN '20110401' AND '20110430'

Etiquetas: consulta-sql, tablas
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:39.