Comisiones de ventas - Sobre Querys y GROUP BY

No se si este sería el espacio del foro para esto pero les comparto una experiencia:

Tenía tiempo de hacer un reporte de comisiones, mismas que se aplican en un % del pago según el producto y el indicador porcentual establecido para ello. En ese sentido yo cree entonces 2 tablas de usuario:
1- Que es un definidor de grupos de artículos con sus %
image

2- Una matriz con un código de cada vendedor y el indicador porcentual según cada grupo.

Después en la tabla de empleados de ventas, definí como comentario el código de cada vendedor:
image

He hice mi Query:

SELECT 
	T4."DocNum" AS Pago,
	T3."DocNum" AS No_DPago,
	T0."DocEntry" AS DocEntryFac, 
	T0."NumAtCard" AS No_Factura,
	(SELECT COUNT(*) FROM "DB"."INV1" 
		WHERE "DocEntry" = T0."DocEntry" AND "ItemCode" != 'FLE-VTAS')  AS Cant_Line,
	T1."ItemCode" AS Cod_Prod, 
	T1."Dscription" AS Prod,
	T0."CardCode" AS Cod_Cliente, 
	T0."CardName" AS Cliente, 
	T0."DocCur" AS Moneda, 
	T4."DocType" AS Tipo_Doc, 
	T4."Canceled" AS Cancelado, 
	T4."DocDate" AS Fehca_Pago,
	T1."LineNum" AS No_Linea,
	T1."GTotal" AS Mnt_Linea, 
	T0."DocTotal" AS Mnt_Factura,
	CASE 
		WHEN T2."U_FC_Afect" != '' THEN 'SI'
		ELSE 'NO' 
	END AS N_Cred,
	CASE
		WHEN T2."DocType" = 'S' OR T2."DocType" = 'I' THEN T2."DocType"
		ELSE ''
	END AS Tipo_NC,
	CASE 
		WHEN T2."DocTotal" > 0 THEN T2."DocTotal"
		ELSE 0
	END AS Mnt_NC, 
	CASE --T2."U_FC_Afect" = T0."NumAtCard" AND
		WHEN T7."ItemCode" = 'FLE-VTAS' THEN 0 
		WHEN T2."U_FC_Afect" = T0."NumAtCard" AND T7."ItemCode" != 'FLE-VTAS' THEN (T0."DocTotal" - T2."DocTotal")	
		WHEN T2."U_FC_Afect" = '' AND T7."ItemCode" != 'FLE-VTAS' THEN T0."DocTotal"
		ELSE 0 
	END AS Mnt_Final,
	(SELECT SUM("SumApplied") FROM "DB"."RCT2" WHERE "DocEntry" = T0."DocEntry") AS Total_Pago,
	T4."DocTotal" AS MntGlobal_Pago, 
	T8."SlpName" AS Vendedor,
	CASE 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 1 THEN (SELECT "U_RRS" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 2 THEN (SELECT "U_JBS" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 3 THEN (SELECT "U_BGK" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 4 THEN (SELECT "U_STB" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 6 THEN (SELECT "U_GKF" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 7 THEN (SELECT "U_LIB" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 8 THEN (SELECT "U_ERG" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		ELSE 0 
	END AS por100
-- FACTURA --
FROM "DB"."OINV" T0 
	-- DETALLE DE FACTURA --
	INNER JOIN "DB"."INV1" T1 ON T0."DocEntry" = T1."DocEntry"
	-- NOTAS DE CREDITO --
	LEFT JOIN "DB"."ORIN" T2 ON T0."NumAtCard" = T2."U_FC_Afect" AND T2."CANCELED" = 'N'
	-- DETALLES DEL PAGO --
	INNER JOIN "DB"."RCT2" T3 ON T0."DocEntry" = T3."DocEntry"
	-- PAGO --
	INNER JOIN "DB"."ORCT" T4 ON T3."DocNum" = T4."DocEntry"
	-- ARTICULOS --
	LEFT JOIN "DB"."OITM" T7 ON T1."ItemCode" = T7."ItemCode"  
	-- VENDEDORES --
	INNER JOIN "DB"."OSLP" T8 ON T0."SlpCode" = T8."SlpCode" 
WHERE  T4."Canceled" = 'N' AND 
	T4."DocDate" BETWEEN  '2018-08-01' AND '2018-08-31' AND 
	T0."NumAtCard" = '001-001-0002973' AND
	T8."SlpCode" = 2
	
GROUP BY T3."DocNum",
	T4."DocNum",
	T0."DocEntry", 
	T0."NumAtCard", 
	T1."ItemCode", 
	T1."Dscription",
	T0."CardCode", 
	T0."CardName", 
	T0."DocCur",
	T1."LineNum", 
	T1."GTotal", 
	T0."DocTotal",
	T2."U_FC_Afect",
	T2."DocType",
	T8."SlpName",
	T7."ItemCode",
	T2."DocTotal",
	T7."U_GRP_COM",
	T8."SlpCode",
	T4."DocType", 
	T4."Canceled", 
	T4."DocDate", 
	T4."CashSum", 
	T4."CheckSum", 
	T4."TrsfrSum", 
	T4."CreditSum",
	T4."DocTotal"

Bueno en el Query hay algo que no sabia hacer:

Nota:
Este bloque

CASE 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 1 THEN (SELECT "U_RRS" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 2 THEN (SELECT "U_JBS" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 3 THEN (SELECT "U_BGK" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 4 THEN (SELECT "U_STB" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 6 THEN (SELECT "U_GKF" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 7 THEN (SELECT "U_LIB" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		WHEN T7."U_GRP_COM" != '' AND T8."SlpCode" = 8 THEN (SELECT "U_ERG" FROM "DB"."@COMISIONES" WHERE "U_GRUPO" = T7."U_GRP_COM") 
		ELSE 0 
	END AS por100

En realidad debía ser más pequeño, la idea era mirar en el campo de usuario de OINV U_GRUPO que tiene un dato de la tabla de usuario 1 que cree. Y ese dato entonces teniendo el flitro del Vendedor, poder buscar en el tabla 2 su indicador porcentual. La verdad es que eso me venció y decidí hacerlo de esta forma que al final me funciona. Así que es casi lo mismo; aunque hubiera sido más prolijo leer ese dato más directo.

Bueno continuo
El tema es que las líneas del Query

T1.“LineNum” AS No_Linea,

y su GROUP BY respectivo no las tenía entonces me sucedió que en una factura de cliente habían 7 líneas de las cuales 2 de ellas eran exactamente iguales… misma cantidad, mismo precio, mismo producto, mismo monto… en fin todo lo mismo excepto que eran líneas diferentes. Que me sucedió me dice mi jefe que una línea no salia. Estuve a punto de desproticar por mi reporte y hacer un post acá buscando toda la ayuda, pero entonces recordé el tema del Group By y me dije si todo es igual en el detalle, hay algo que puede ser diferente… recurrí a mi HANA Studio y busque el registro correspondiente y BINGO

LineNum era el tipo que buscaba para que las líneas no tuvieran el mismo dato… Toda esta experiencia o cuento macabro ¿por qué? Pues porque compañeros a veces no nos damos cuentas de los más mínimos detalles y son pequeñas cosas que nos revelan la solución.

Enseñanza: Los Querys con GROUP BY deben tener datos diferentes para que toda la info salga como debe ser.

Saludos,
David

4 Me gusta