on 08-19-2011 3:18 PM
Buenos días,
Tengo la siguiente consulta:
SELECT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.[OnHand]as existencia, T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', T3.[AvgPrice]'Costo', T4.[WhsName]
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ItemCode = T3.ItemCode
INNER JOIN OWHS T4 ON T3.WhsCode = T4.WhsCode
Ahora lo que esta pasando es lo siguiente: como veran se trae el codigo del articulo, descripcion, existencia, precio base, ultimo precio de compra, costo y almacenes, este costo viene de la tabla OITW junto con los almacenes, lo que sucede cuando ejecuto el reporte es que por cada articulo se trae los 10 almacenes que tengo creado, tengan o no costos, lo que quisiera es que cuando lo ejecute solo se traiga un solo almacen y que sea el almcen que tenga el costo mayor.
Por favor si me pueden ayudar con esto.
Salos y gracias de antemano.
agregale un distinct() y selecciona el max (t0.avgprice) en el oitw. tienes que agrouparlo en el último para que salga el almacen.
:D!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
No se dime tu si lo que hice es lo correcto o como seria, porque igual no hace lo que quiero O.o
SELECT DISTINCT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.[OnHand]as existencia, T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', max (t3.AvgPrice)'Costo', T4.[WhsName]
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ItemCode = T3.ItemCode
INNER JOIN OWHS T4 ON T3.WhsCode = T4.WhsCode
WHERE T3.[AvgPrice] > 0
GROUP BY T4.[WhsName], T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc], T3.[AvgPrice]
mira, busca transact sql y encontraras funciones como MIN, MAX y AVG para poder seleccionar el mas grande o menor de una columna, sumar o promediar. ahorita estaba pensando en como hacer una. pero tengo una pregunta, quieres el mayor costo de todos los almacenes, verdad?, es que ando pensando como hacer eso. oks.
A VER, INTENTA con este código, lo que sucede es que yo no manejo los costos en los almacenes, si no es un costo global. el que viene en el dato maestro.
SELECT DISTINCT(T0.[ItemCode]), T1.[ItemName], T2.WHSNAME,MAX(T0.[AvgPrice])
FROM OITW T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OWHS T2 ON T0.WHSCODE=T2.WHSCODE
where t0.avgprice>0
GROUP BY T0.[ItemCode], T1.[ItemName], T2.[WhsNAME]
CHECA SI ESTO TE SIRVE ES PARA costos, pero también quieres precios nop??
me pones tu query, para checarlo?. Y ASI??.. A MI ME TRAE VARIOS ALMACENES POR QUE TIENEN EL MISMO COSTO.
SELECT DISTINCT(T1.[WHSCODE]),T0.ITEMCODE, T0.[ItemName], T2.[WhsNAME],MAX(T1.[AvgPrice])
FROM OITM T0
INNER JOIN OITW T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OWHS T2 ON T1.WHSCODE=T2.WHSCODE
where t1.avgprice>0
GROUP BY T1.WHSCODE,T0.[ItemCode], T0.[ItemName], T2.[WhsNAME]
Edited by: mary merecias on Aug 19, 2011 1:40 PM
SELECT T0.[ItemCode]as codigo, T0.[ItemName] as Descripcion, T0.[OnHand]as existencia, T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', MAX(t3.AvgPrice)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ItemCode = T3.ItemCode
INNER JOIN OWHS T4 ON T3.WhsCode = T4.WhsCode
WHERE T3.[AvgPrice] > 0
GROUP BY T4.[WhsName], T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc], T3.[AvgPrice]
ORDER BY T0.[ItemCode]
El que me acabas de pasar hace lo mismo, repite las lineas de arituculos.
el distinct ees importante en este caso, por que solo te muestra uno, si pones el nombre de la sucursal te enviará el nombre de la sucursal.
SELECT DISTINCT(T0.[ItemCode])as codigo, t4.whsname,T0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', MAX(t3.AvgPrice)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ItemCode = T3.ItemCode
INNER JOIN OWHS T4 ON T3.WhsCode = T4.WhsCode
WHERE T3.[AvgPrice] > 0
GROUP BY T0.[ItemCode], T4.[WhsName],T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc], T3.[AvgPrice]
ORDER BY T0.[ItemCode]
ejecutalo y me cuentas, por que tal vez a mi también me sirva luego.
a ver.
y si lo dejas sin el nombre del almacen. te trae el costo pero no sabes que almacen es.
SELECT DISTINCT(T0.[ItemCode])as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', MAX(t3.AvgPrice)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ItemCode = T3.ItemCode
INNER JOIN OWHS T4 ON T3.WhsCode = T4.WhsCode
WHERE T3.[AvgPrice] > 0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc], T3.[AvgPrice]
ORDER BY T0.[ItemCode]
Si ya habia probado quitandole el nombre del almacen,pero nada aun asi repite las lineas para aquellos articulos con almacenes que tienen costos.
Pero esta faltando como algo mas, porque se le esta diciendo MAX(T3.AvgPrice), pero falta algo mas que ligue esto con los almacenes, algo asi como que traeme el max de este grupo de alamcenes, o mas rebuscado seria que validara cada almacen y mostrar el costo mayor.
costo Almacen 1 > costo almacen 2 si, entonces pase el almacen 1.
costo Almacen 1 >costo almacen 3 no, entonces pase el alamcen 3.
Y asi, no se, seguro hay algun comando que haga esto mas directo.
espero que este ahora, si te ayude, oks. :D! me dices si funciona
SELECT T0.[ItemCode] as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra',
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo',
(SELECT WHSCODE FROM OITW WHERE ITEMCODE=T0.ITEMCODE AND (SELECT MAX(AVGPRICE) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)=AVGPRICE)'ALMACEN'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc]
ORDER BY T0.[ItemCode]
ESto me marco error en el 2007 y sql server 2005, pero en el sap 8.8 funciono bien, lo probe en una version que tengo de prueba. espero que te sirva este query.
SI ESA TE marca error prueba con esta, te vaa poner los repetidos por que tienen el mismo costo. oks?.
SELECT T0.[ItemCode] as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra', T3.WHSCODE,
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ITEMCODE=T3.ITEMCODE AND (SELECT MAX(AVGPRICE) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)=T3.AVGPRICE
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc],T3.WHSCODE
ORDER BY T0.[ItemCode]
Edited by: mary merecias on Aug 22, 2011 1:39 AM
Edited by: mary merecias on Aug 22, 2011 1:48 AM
Edited by: mary merecias on Aug 22, 2011 1:57 AM
si no ocupas el nombre del almacen entonces quitamos el codigo del almacen y ponemos un distinct en itemcode, y con eso debe de quedar.
SELECT distinct(T0.[ItemCode]) as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra',
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ITEMCODE=T3.ITEMCODE AND (SELECT MAX(AVGPRICE) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)=T3.AVGPRICE
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc],T3.WHSCODE
ORDER BY T0.[ItemCode]
mira este es con codigo de almacen. :D!! te trae el primer almacen para que no tengas problemas, de los repetidos. oks?
me dices si funciona
SELECT distinct(T0.[ItemCode]) as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra',
(select top(1) whscode
from OITW
where itemcode=t0.itemcode and
(select max(avgprice) from oitw where itemcode=t0.itemcode)=avgprice)'almacen',
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc]
ORDER BY T0.[ItemCode]
Edited by: mary merecias on Aug 22, 2011 10:31 AM
Edited by: mary merecias on Aug 22, 2011 10:38 AM
siiii esta perfecta la primera consultaaa :)... Ya tienes tendras tus putos jaja, vale muchas graciass, pero aun no cierro porque me surgio otro asunto.
Al reporte le agregue, un margen (resta entre el precio base - costo), y margen %, ahora que pasa en el margen %, hay % que me trae que si 4367, 9847, etc, montos muy altos y eso es correcto pero no se ve bien, lo que quisiera es que para aquellos % que sean mayor a 1000, entonces que en el reporte aparezca solo 1000 , te paso la consulta como esta hasta ahora.
SELECT distinct(T0.[ItemCode]) as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra',
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo', T1.[Price] - (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE) 'Margen', ((T1.[Price] - (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)) * 100) / (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE) 'Margen %'
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ITEMCODE=T3.ITEMCODE AND (SELECT MAX(AVGPRICE) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)=T3.AVGPRICE
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc],T3.WHSCODE
ORDER BY T0.[ItemCode]
Agrega un CASE
SELECT distinct(T0.[ItemCode]) as codigo, t0.[ItemName] as Descripcion, T0.[OnHand]as existencia,
T1.[Price] AS 'Precio Base',T0.[LastPurPrc]as 'Ultimo Precio de Compra',
(SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)'Costo', T1.[Price]
- (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE) 'Margen',
'Margen %'= case when ((T1.[Price]
- (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)) * 100) / (SELECT MAX(AvgPrice)
FROM OITW WHERE ITEMCODE=T0.ITEMCODE) >1000 then 1000
else
((T1.[Price] - (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)) * 100) / (SELECT MAX(AvgPrice)
FROM OITW WHERE ITEMCODE=T0.ITEMCODE) end
FROM OITM T0
INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode AND T1.PRICELIST = 1
INNER JOIN ITM1 T2 ON T0.ITEMCODE = T2.ITEMCODE AND T2.PRICELIST = 2
INNER JOIN OITW T3 ON T0.ITEMCODE=T3.ITEMCODE AND (SELECT MAX(AVGPRICE) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)=T3.AVGPRICE
WHERE (SELECT MAX(AvgPrice) FROM OITW WHERE ITEMCODE=T0.ITEMCODE)>0
GROUP BY T0.[ItemCode], T0.[ItemName], T0.[OnHand], T1.[Price],T0.[LastPurPrc],T3.WHSCODE
ORDER BY T0.[ItemCode]
Miguel Angel,
No utilice el INNER JOIN. Esa es la que le trae los registros duplicados. Mejor coloque la tabla en el from pero sin el INNER JOIN y luego en el where haga la asociación como a usted le conviene.
Atte. Rosa
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
98 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.