In un post precedente abbiamo visto come effettuare delle elaborazioni sulla distinta base ovvero esplosione ed implosione, a partire da queste due operazioni è possibile effettuare altre operazioni come verificare se due distinte sono uguali o se sono simili.
Due distinte sono uguali se hanno gli stessi codici e lo stesso coefficiente d’impiego. Se consideriamo due tabelle: DISTINTA A (PADRE_A, FIGLIO_A, COEF_A) ; DISTINTA B (PADRE_B, FIGLIO_B, COEF_B)
Possiamo verificare se sono uguali tramite queste query:
SELECT [DISTINTA A].PADRE_A, [DISTINTA A].FIGLIO_A, [COEF_A]-[COEF_B] AS [DIF COEF], IIf([FIGLIO_A]=[FIGLIO_B],"UGUALE","DIVERSO") AS [DIF COD] INTO DIFFERENZE FROM [DISTINTA A] LEFT JOIN [DISTINTA B] ON ([DISTINTA A].FIGLIO_A = [DISTINTA B].FIGLIO_B) AND ([DISTINTA A].PADRE_A = [DISTINTA B].PADRE_B); |
SELECT [DISTINTA A].PADRE_A, [DISTINTA A].FIGLIO_A, [COEF_A]-[COEF_B] AS [DIF COEF], IIf([FIGLIO_A]=[FIGLIO_B],"UGUALE","DIVERSO") AS [DIF COD] INTO DIFFERENZE FROM [DISTINTA A] LEFT JOIN [DISTINTA B] ON ([DISTINTA A].FIGLIO_A = [DISTINTA B].FIGLIO_B) AND ([DISTINTA A].PADRE_A = [DISTINTA B].PADRE_B);
INSERT INTO DIFFERENZE ( PADRE_A, FIGLIO_A, [DIF COEF], [DIF COD], FIGLIO_A ) SELECT [DISTINTA B].PADRE_B, [DISTINTA B].FIGLIO_B, [COEF_A]-[COEF_B] AS [DIF COEF], IIf([FIGLIO_A]=[FIGLIO_B],"UGUALE","DIVERSO") AS [DIF COD], [DISTINTA A].FIGLIO_A FROM [DISTINTA A] RIGHT JOIN [DISTINTA B] ON ([DISTINTA A].FIGLIO_A = [DISTINTA B].FIGLIO_B) AND ([DISTINTA A].PADRE_A = [DISTINTA B].PADRE_B) WHERE ((([DISTINTA A].FIGLIO_A) IS NULL)); |
INSERT INTO DIFFERENZE ( PADRE_A, FIGLIO_A, [DIF COEF], [DIF COD], FIGLIO_A ) SELECT [DISTINTA B].PADRE_B, [DISTINTA B].FIGLIO_B, [COEF_A]-[COEF_B] AS [DIF COEF], IIf([FIGLIO_A]=[FIGLIO_B],"UGUALE","DIVERSO") AS [DIF COD], [DISTINTA A].FIGLIO_A FROM [DISTINTA A] RIGHT JOIN [DISTINTA B] ON ([DISTINTA A].FIGLIO_A = [DISTINTA B].FIGLIO_B) AND ([DISTINTA A].PADRE_A = [DISTINTA B].PADRE_B) WHERE ((([DISTINTA A].FIGLIO_A) Is Null));
SELECT DIFFERENZE.PADRE_A AS CODICE, SUM(IIf([DIF COD]="DIVERSI",1,0)) AS CODICI, SUM(IIf([DIF COEF]<>0,1,0)) AS COEFFICIENTI FROM DIFFERENZE GROUP BY DIFFERENZE.PADRE_A; |
SELECT DIFFERENZE.PADRE_A AS CODICE, Sum(IIf([DIF COD]="DIVERSI",1,0)) AS CODICI, Sum(IIf([DIF COEF]<>0,1,0)) AS COEFFICIENTI FROM DIFFERENZE GROUP BY DIFFERENZE.PADRE_A;
SELECT [RIEPILOGO DIFFERENZE].CODICE, [RIEPILOGO DIFFERENZE].CODICI, [RIEPILOGO DIFFERENZE].COEFFICIENTI, IIf([CODICI]=0 AND [COEFFICIENTI]=0,"UGUALI","DIVERSI") AS CONFRONTO FROM [RIEPILOGO DIFFERENZE]; |
SELECT [RIEPILOGO DIFFERENZE].CODICE, [RIEPILOGO DIFFERENZE].CODICI, [RIEPILOGO DIFFERENZE].COEFFICIENTI, IIf([CODICI]=0 And [COEFFICIENTI]=0,"UGUALI","DIVERSI") AS CONFRONTO FROM [RIEPILOGO DIFFERENZE];
Per verificare se due distinte sono simili bisogna impostare delle regole per cui le distinte sono considerate simili, una prima regola stringente può essere quella per cui sono simili se hanno tutti I codici uguali ma cambiano i coefficienti d’impiego, un’altra regole meno stringente è quella di considerare simili le distinte che hanno una percentuali di codici uguali.