Query de saldos por mes

Buen día Expertos, estaba tratando de realizar un Query de saldos por mes y por almacén y no logro encontrar el camino, les envío más o menos como quiero lograr

Año/Mes # Articulo # Almacén # Unidad # Stock Final # Costo Prom.
2021/01 # AAA # ALM01 # UND # 300 # 23.50
2021/01 # AAA # ALM02 # UND # 250 # 23.50
2021/02 # AAA # ALM01 # UND # 450 # 24.00
2021/03 # AAA # ALM02 # UND # 600 # 24.30
Espero sus sugerencias o alguien que ya pudo realizar esto.

Muchas gracias por su pronta respuesta.

Mi sugerencia es que utilices el informe de auditoria de stock, bajas a excel esa consulta y filtras como tu necesites.

image

buen dia @julio.jmz la finalidad de este query es alimentar a un indicador que queremos desarrollar.

Podrías subir tu consulta para tratar de ayudar a depurarla?

buen día @MarcoABC , te anexo este pequeño código, espero y te sea de utilidad, saludos!!!

select 
	month (GETDATE()) as 'mes',
	YEAR (getdate ()) as 'año',
	t0.ItemCode,
	t1.ItemName, 
	t0.WhsCode,
	t1.InvntryUom, 
	t0.OnHand,
	t1.AvgPrice 
from OITW T0 
	inner join OITM T1 on T1.ItemCode=T0.ItemCode 
where t0.OnHand >0
order by T0.ITEMCODE, T0.WHSCODE

buen dia @anon54430183 ese informe solo mostraria el stock a la fecha actual, lo que estoy buscando hacer es terner saldos fiales por mes.

como tienes tu inventario, esta lotificado, esta por series??

Es sin lote, ni serie

Tengo esta Consulta que me envia el saldo a la fecha actual, Pero quiero los saldos agrupados por año, mes y almacen.

SELECT 
T2."ItemCode", 
T2."ItemName", 
T1."WhsCode", 
T1."WhsName",
IFNULL((SELECT (SUM(Y."InQty")-SUM(Y."OutQty"))
      FROM OINM Y 
      WHERE Y."ItemCode" = T2."ItemCode" AND Y."Warehouse" = T1."WhsCode" AND Y."DocDate" <= '2021-12-31'),0) AS "Stock",
T3."ItmsGrpNam"
FROM OITM T2
INNER JOIN OITW T0 ON T0."ItemCode" = T2."ItemCode"
INNER JOIN OWHS T1 ON T1."WhsCode" =T0."WhsCode"
INNER JOIN OITB T3 ON T2."ItmsGrpCod" = T3."ItmsGrpCod"
ORDER BY T2."ItemCode", T1."WhsCode"

Este es mi base…

1 me gusta

Tienes que hacer un group by de OINM por la fecha del documento especificando el mes MONTH(OINM.DocDate)

SELECT year(Y."DocDate"), month(Y."DocDate"), (SUM(Y."InQty")-SUM(Y."OutQty"))
      FROM OINM Y 
      WHERE Y."DocDate" <= '2021-12-31' 
group by year(Y."DocDate"), month(Y."DocDate")

buen dia @meqs en teoria obtendria el saldo final por mes, pero tambien esta incluido el saldo final del mes pasado???

Eso depende de las fechas que pongas en el WHERE…
Si la ejecutas individualmente verás los datos que te da y como te los agrupa

SELECT 
EJERCICIO, 
PERIODO,
COD_ALMACEN,
ALMACEN,
COD_GRUPO,
GRUPO,
COD_ARTICULO,
ARTICULO,
PRECIO,
SW_OBSOLETO,
CANTIDAD,
SUM(CANTIDAD) OVER ( PARTITION BY COD_ALMACEN,COD_ARTICULO ORDER BY EJERCICIO,PERIODO,COD_ALMACEN,COD_ARTICULO) AS STOCK
FROM
(
	SELECT 
	year(TC."RateDate") AS EJERCICIO,
	month(TC."RateDate") AS PERIODO,
	ST."WhsCode" AS COD_ALMACEN,
	ALM."WhsName" AS ALMACEN,
	ART."ItmsGrpCod" AS COD_GRUPO,
	UPPER(GR."ItmsGrpNam") AS GRUPO,
	ART."ItemCode" AS COD_ARTICULO,
	ART."ItemName" AS ARTICULO,
	ART."LastPurPrc" AS PRECIO,
	(
		SELECT
		CASE WHEN MESES_SIN_CONS >= 6 THEN 1 ELSE 0 END
		FROM
		( 
			SELECT
			MONTHS_BETWEEN (MV."DocDate",LAST_DAY(TO_DATE(year(TC."RateDate")||'-'||month(TC."RateDate")||'-'||'1'))) AS MESES_SIN_CONS,
			row_number()over(order by MV."DocDate" desc) rn
			FROM OINM MV
			WHERE MV."DocDate" <= LAST_DAY(TO_DATE(year(TC."RateDate")||'-'||month(TC."RateDate")||'-'||'1'))
			AND MV."ItemCode" = ART."ItemCode" AND MV."Warehouse" = MV."Warehouse"			
		) WHERE rn=1			
	) AS SW_OBSOLETO,
	case when exists (
	      select * from OINM MV
	      where MV."ItemCode" = ART."ItemCode" and YEAR(MV."DocDate") = year(TC."RateDate") AND month(MV."DocDate") = month(TC."RateDate")
	      AND MV."Warehouse" = ST."WhsCode"
	    ) then 
		(
			select IFNULL(SUM("InQty")-SUM("OutQty"),0) from OINM MV
	    	where MV."ItemCode" = ART."ItemCode" and YEAR(MV."DocDate") = year(TC."RateDate") AND month(MV."DocDate") = month(TC."RateDate")
	    	AND MV."Warehouse" = ST."WhsCode"
		)
	    else 0
	end AS CANTIDAD
	FROM ORTT TC
	INNER JOIN OITM ART ON 2021 = 2021
	INNER JOIN OITB AS GR on GR."ItmsGrpCod" = ART."ItmsGrpCod"
	INNER JOIN OITW ST ON ST."ItemCode" = ART."ItemCode"
	INNER JOIN OWHS ALM ON ALM."WhsCode" = ST."WhsCode"
	WHERE TC."RateDate" <= CURRENT_DATE AND ART."ItmsGrpCod" NOT IN ('111','112')
	AND EXISTS (
		select * from OINM MV
		where YEAR(MV."DocDate") = year(TC."RateDate") AND month(MV."DocDate") = month(TC."RateDate")
		AND MV."Warehouse" = ST."WhsCode"
	)
	GROUP BY
	year(TC."RateDate"),
	month(TC."RateDate"),
	ST."WhsCode",
	ALM."WhsName",
	ART."ItmsGrpCod",
	UPPER(GR."ItmsGrpNam"),
	ART."ItemCode",
	ART."ItemName",
	ART."LastPurPrc"
	ORDER BY 1,2
)

Ya tengo la solución, derrepente les ayude para tener saldos por mes y por almacen.

Adicional si me pueden ayudar a optimizar este Query, demora unos 40 segundos en procesar.

Gracias.

1 me gusta