Agregar precio unitario a Query

Buenos días amigos:

Necesito su ayuda. En la empresa tenemos el siguiente Query en SAP B/O:

SELECT T0.[ItemCode], T0.[ItemName], T1.[BatchNum], T1.[WhsCode], T1.[Quantity]
 FROM [dbo].[OITM]  T0 INNER JOIN OIBT T1 ON T0.ItemCode = T1.ItemCode
 WHERE T1.[Quantity] != 0 and T1.[WhsCode] = [%0]

El cual funciona perfecto (me muestra por ejemplo 87 registros), ahora resulta que me estan pidiendo que a este query le agrege el PRECIO UNITARIO el cual lo estoy tomando de la tabla PDN1. El query me quedó de esta forma:

SELECT T0.[ItemCode], T0.[ItemName], T1.[BatchNum], T1.[WhsCode], T1.[Quantity], T2.[Price]
FROM OITM T0
     INNER JOIN OIBT T1 ON T0.[ItemCode] = T1.[ItemCode]
     INNER JOIN PDN1 T2 ON T1.[ItemCode] = T2.[ItemCode]
WHERE T1.[Quantity] != 0 and T1.[WhsCode] = '[%0]'

El problema que tengo es que me muestra datos duplicados (me muestra 496 registro, no los 87 que me muestra con el query anterios - antes de hacerle la modificación). Si le agrego un GROUP BY el numero de registro disminuye a 287 pero igual siempre hay duplicados.

Podrian apoyarme indicando como podría solucionar mi problema. Agradeceré que me iluminen!!!

P.D. mi jefe me dice que debo agregar la tabla OPDN, ya lo hice tambien pero sigue mostrandome el ismo resultado.

Buen día, @Murga, lo que puedes hacer es una subconsulta para traerte solo el price sin necesidad de agregarlo en el inner join, ej. en la consulta solo haces un select al campo price de la tabla pnd1 y en el where que el itemcode de tu subconsulta sea igual al itemcode de tu consulta. con eso deberias de traerte el price sin duplicados.

Muchas gracias @Enrique1 voy a probar lo que me recomiendas y te comento!!!

Mas o menos creo que tengo la idea, pero me falta pulirla un poco, podrían iluminarme!!!

SELECT T0.[ItemCode], T0.[ItemName], T1.[BatchNum], T1.[WhsCode], T1.[Quantity] 
	FROM [dbo].[OITM] T0
	INNER JOIN OIBT T1 ON T0.ItemCode = T1.ItemCode
WHERE T1.[Quantity] != 0 and T1.[WhsCode] = 'MPL' 
(SELECT T2.[Price] from [dbo].[PDN1] T2)

Me muestra todos los articulos, pero los precios me muestra muchos datos :’(

Seria algo así @Murga, la subconsulta debe ir en el select from de la consulta principal.

SELECT T0.[ItemCode], 
            T0.[ItemName], 
            T1.[BatchNum], 
            T1.[WhsCode], 
            T1.[Quantity],
            (SELECT A.Price FROM PDN1 A WHERE A.ItemCode = T0.ItemCode) 'Price'
FROM [dbo].[OITM] T0
INNER JOIN OIBT T1 ON T0.ItemCode = T1.ItemCode
WHERE T1.[Quantity] != 0 and T1.[WhsCode] = 'MPL'

Gracias @Enrique1
Sólo que me marca un error en ese ‘Price’ que esta suelto al final de la subconsulta

SELECT	T0.[ItemCode] AS 'ID ARTICULO',
		T0.[ItemName] AS 'NOMBRE ARTICULO',
		T1.[BatchNum] AS '# LOTE',
		T1.[WhsCode] AS 'ID ALMACEN',
		T1.[Quantity] AS 'CANTIDAD'
		(SELECT T2.[Price] AS 'PRECIO' from [dbo].[PDN1] T2 where T2.[ItemCode] = T0.[ItemCode]) 'Price'
	FROM [dbo].[OITM] T0
	INNER JOIN OIBT T1 ON T0.[ItemCode] = T1.[ItemCode]
where T1.[Quantity] != 0 and T1.[WhsCode] = 'MPL'

Este es el error que me marca:

Msg 102, Level 15, State 1, Line 6
Incorrect syntax near 'Price'.

te falta la coma que va en “cantidad” arriba de la subconsulta.

Si tienes razon:

SELECT	T0.[ItemCode] AS 'ID ARTICULO',
		T0.[ItemName] AS 'NOMBRE ARTICULO',
		T1.[BatchNum] AS '# LOTE',
		T1.[WhsCode] AS 'ID ALMACEN',
		T1.[Quantity] AS 'CANTIDAD',
		(SELECT T2.[Price] AS 'PRECIO' from [dbo].[PDN1] T2 where T2.[ItemCode] = T0.[ItemCode]) 'Price'
	FROM [dbo].[OITM] T0
	INNER JOIN OIBT T1 ON T0.[ItemCode] = T1.[ItemCode]
where T1.[Quantity] != 0 and T1.[WhsCode] = 'MPL'

Pero me marca este otro error:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

el error sale porque para ese almacén los artículos tienen mas de 1 precio, te aconsejo usar un TOP 1 y order by con la fecha para traerte el ultimo precio que tengas del articulo.
ej (SELECT TOP 1 T2.Price FROM PDN1 T2 INNER JOIN OPDN T3 ON T2.DocEntry = T3.DocEntry WHERE T2.ItemCode = T0.ItemCode ORDER BY T3.DocDate DESC) 'PRECIO'.
aquí te esta trayendo solo el ultimo precio de ese articulo en la tabla pdn1, así no debería de marcar ese error.

@Murga, bienvenido a la comunidad, lee: Cómo usar el foro de Consultoria-SAP en la parte de código, para formatear correctamente el código, no lo pegues así nomas en el mensaje por favor.

no es la mejor forma de conseguir el precio, estas consultando el detalle de un documento, el precio lo sacas de la lista de precio, tabla ITM1, ahi escoges la lista de precio, y sacas el precio del campo “Price”.
Tu query quedaria asi:

SELECT T0.[ItemCode], T0.[ItemName], T1.[BatchNum], T1.[WhsCode], T1.[Quantity], T2.[Price]
FROM OITM T0
     INNER JOIN OIBT T1 ON T0.[ItemCode] = T1.[ItemCode]
     INNER JOIN ITM1 T2 ON T1.[ItemCode] = T2.[ItemCode] and T2.[PriceList]=0 
WHERE T1.[Quantity] != 0 and T1.[WhsCode] = '[%0]'

Si tu lista de precio principal es la cero

1 me gusta

Muchas gracias amigo por tu ayuda!!!

Excelente amigo @Enrique1, muchisimas gracias por tu ayuda. Hoy aprendí algo nuevo, exactamente eso era lo que buscaba!!!

P.D. Comparto el código por si a alguien más le sirve:

SELECT	T0.[ItemCode] AS 'ID ARTICULO',
		T0.[ItemName] AS 'NOMBRE ARTICULO',
		T1.[BatchNum] AS '# LOTE',
		T1.[WhsCode] AS 'ID ALMACEN',
		T1.[Quantity] AS 'CANTIDAD',
		(SELECT TOP 1 T2.[Price] from [dbo].[PDN1] T2 INNER JOIN OPDN T3 ON T2.DocEntry = T3.DocEntry where T2.[ItemCode] = T0.[ItemCode] ORDER BY T3.DocDate DESC) 'PRECIO'
	FROM [dbo].[OITM] T0
	INNER JOIN OIBT T1 ON T0.[ItemCode] = T1.[ItemCode]
where T1.[Quantity] != 0 and T1.[WhsCode] = [%0]

Enterado, DE AQUI EN ADELANTE LO HARÉ DE LA FORMA CORRECTA COMO LO SUGUIERE EL FORO, mil disculpas!!!

1 me gusta