Consulta SQL Obtener totales por año

sql
Etiquetas: #<Tag:0x00007f4360dd2200>

#1

Hola buenas…Trato de obtener las ventas por año filtrando unas determinadas lineas de INV1 …
Me estoy liando a ver si alguien me echa un cable… No logro que me funcione …

SELECT TT.SlpCode, TT.SlpName, MAX(TT.Actual) as 'Ventas Año Actual'

FROM (

SELECT T0.SlpCode, T1.SlpName,

isnull((SELECT SUM(LineTotal) AS IMPORTE FROM INV1 INNER JOIN OINV ON INV1.DocEntry=OINV.DocEntry WHERE INV1.AcctCode IN ('705000', '705008', '705028', '705031') and year(OINV.DocDate)=year(getdate()) group by OINV.SlpCode),0) as 'Actual', 
isnull((SELECT SUM(LineTotal) AS IMPORTE FROM INV1 INNER JOIN OINV ON INV1.DocEntry=OINV.DocEntry WHERE INV1.AcctCode IN ('705000', '705008', '705028', '705031') and year(OINV.DocDate)=year(getdate())-1 group by OINV.SlpCode),0) as 'Anterior'

FROM OINV T0 INNER JOIN OSLP T1 on T0.SlpCode=T1.SlpCode 


) TT

GROUP BY TT.SlpCode, TT.SlpName

#2

Hola @meqs
Lo siguiente me funciona sobre HANA, reemplaza la funcion ADD_YEARS por DATEADD de SQLSERVER

SELECT TT."SlpCode", TT."SlpName", SUM(TT."Anterior"), SUM(TT."Actual")
FROM 
(
	SELECT T2."SlpCode", T2."SlpName", 0 "Anterior", SUM(T1."LineTotal") "Actual"
	FROM OINV T0 INNER JOIN INV1 T1 ON T1."DocEntry" = T1."DocEntry"
	INNER JOIN OSLP T2 ON T0."SlpCode" = T2."SlpCode" 
	WHERE T0."CANCELED" ='N' AND T1."AcctCode" IN ('705000', '705008', '705028', '705031') AND T0."DocDate" BETWEEN [%0] AND [%1]
	GROUP BY T2."SlpCode", T2."SlpName"

	UNION ALL

	SELECT T2."SlpCode", T2."SlpName", SUM(T1."LineTotal"), 0
	FROM OINV T0 INNER JOIN INV1 T1 ON T1."DocEntry" = T1."DocEntry"
	INNER JOIN OSLP T2 ON T0."SlpCode" = T2."SlpCode" 
	WHERE T0."CANCELED" ='N' AND T1."AcctCode" IN ('705000', '705008', '705028', '705031') AND T0."DocDate" BETWEEN ADD_YEARS([%0],-1) AND ADD_YEARS([%1],-1)
	GROUP BY T2."SlpCode", T2."SlpName"
) TT
GROUP BY TT."SlpCode", TT."SlpName"

Saludos,
Andres Ramirez Jaramillo :colombia:


#3

Andrés @andresramirez no he probado aún tú consulta. Muchas gracias antes de nada.

Al final como siempre, tras un descanso y aclarar la mente ocupándome en otras cuestiones…salió.

Voy a puntualizar que se añaden los abonos del periodo restando de manera concreta solo los de su propio año según las numeraciones de las series y para usar en otras empresas requeriría su estudio y reformulación.

En este aspecto no he logrado automatizar en la consulta que me quite los abonos del año en curso mediante una condición automatizada… pretendo que en el 2018 solo me quite abonos cuya numeración de documento base sea la del año 2018, es decir, valores de basedocnum que empiecen por 2018%, algo así como where rin1.BaseDocNum like year(getdate()) teniendo que fijarlo como ‘2018%’

SELECT TT.SlpName, Max(TT.Actual+TT.Abonos_Actual) as '2018', Max(TT.Anterior+TT.Abonos_Anterior) as '2017', max(TT.Actual) as 'Ventas Año 2018', 
max(TT.Abonos_Actual) as 'Abonos Año 2018', max(TT.Anterior) as 'Ventas Año 2017', max(TT.Abonos_Anterior) as 'Abonos Año 2017'
FROM 
(SELECT T0.SlpCode, T1.SlpName, 
ISNULL((SELECT sum(LineTotal) from INV1 inner join OINV on INV1.DocEntry=OINV.Docentry where OINV.SlpCode=T0.SlpCode and INV1.AcctCode in ('705000', '705008', '705028', '705031') and year(OINV.DocDate)=year(getdate()) group by OINV.SlpCode),0) as 'Actual',
ISNULL((SELECT sum(LineTotal) from INV1 inner join OINV on INV1.DocEntry=OINV.Docentry where OINV.SlpCode=T0.SlpCode and INV1.AcctCode in ('705000', '705008', '705028', '705031') and year(OINV.DocDate)=year(getdate())-1 group by OINV.SlpCode),0) as 'Anterior', 
ISNULL((SELECT sum(LineTotal)*-1 from RIN1 inner join ORIN on RIN1.DocEntry=ORIN.Docentry where ORIN.SlpCode=T0.SlpCode and RIN1.AcctCode in ('705000', '705008', '705028', '705031') and RIN1.BaseDocNum like '2018%' and year(ORIN.DocDate)=year(getdate()) group by ORIN.SlpCode),0) as 'Abonos_Actual',
ISNULL((SELECT sum(LineTotal)*-1 from RIN1 inner join ORIN on RIN1.DocEntry=ORIN.Docentry where ORIN.SlpCode=T0.SlpCode and RIN1.AcctCode in ('705000', '705008', '705028', '705031') and RIN1.BaseDocNum like '2017%%'and year(ORIN.DocDate)=year(getdate())-1 group by ORIN.SlpCode),0) as 'Abonos_Anterior'
FROM OINV T0 INNER JOIN OSLP T1 ON T0.SlpCode=T1.SlpCode) TT 
GROUP BY TT.SlpName 
ORDER BY TT.SlpName

Por aquí lo dejo como consulta usable.


#4