SQL – RAGGRUPPARE DATI DI UN FILE CON LA DISCRIMINANTE SU IN ALTRO FILE

Il . Inserito in Informatica. Visite: 134

Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

In questo esempio, vediamo come raggruppare i dati di fatturato dei clienti in base ad una discriminante presente però su un altro file, l’anagrafica dei clienti. Quest’ultima contiene il campo che deve essere usato per raggruppare i dati.

I due file quindi vanno legati.

Abbiamo dunque il primo file che contiene il codice del cliente e il fatturato mentre sul secondo file abbiamo il codice del cliente e il tipo cliente che sarà il nostro campo di raggruppamento.

La stringa di selezione  sarà questa:

 

SELECT B.TIPOCLI, SUM(A.VGLIV) AS TOTALE              

FROM FATTURATO A

INNER JOIN ANAGRACLI B

ON B.BUCUST=A.VGCUS                 

WHERE B.TIPOCLI NOT IN('VAR','TRD')                   

GROUP BY B.TIPOCLI

ORDER BY SUM(A.VGLIV) DESC, B.TIPOCLI

 

Andiamo ad analizzarla.

La cosa che colpisce subito è la clausola SQL INNER JOIN che serve a legare due tabelle tra loro mediante un campo corrispondente, in questo caso specifico il codice cliente BUCUST e VGCUS (ON B.BUCUST=A.VGCUS) in questo modo, è come se avessimo in tabella gigantesca con tutti i dati delle due tabelle anche se, nella SELECT abbiamo indicato che ci interessano solo il tipo cliente (TIPOCLI) e il totale del valore del fatturato (VGLIV). Una volta fatto questo, possiamo raggruppare (GROUP BY) e ordinare (ORDER BY) come ci pare e piace.

La stringa precedente lavora sul file del fatturato mensile, se invece volessimo estrarre il totale del fatturato dell’anno, dovremmo in qualche modo “fondere” più file di fatturato insieme per avere i dati che ci servono.

Per fare questo usiamo la clausola SQL UNION ALL in questo modo:

 

WITH RPL(TIPOCLI,VGLIV) AS                            

(SELECT B.TIPOCLI, A.VGLIV FROM FATTURATO A                                

INNER JOIN ANAGRACLI B

ON B.BUCUST=A.VGCUS                 

WHERE B.TIPOCLI NOT IN('VAR','TRD')                   

UNION ALL                                            

SELECT B.TIPOCLI, A.VGLIV FROM MESEPREC/FATTURATO A                              

INNER JOIN ANAGRACLI  B

ON B.BUCUST=A.VGCUS                 

WHERE B.TIPOCLI NOT IN('VAR','TRD'))                  

SELECT TIPOCLI, SUM(VGLIV) FROM RPL                   

GROUP BY TIPOCLI

ORDER BY SUM(VGLIV) DESC, TIPOCLI

 

Come si può notare, i file di fatturato (FATTURATO) sono due perché presi da due librerie diverse mentre il file con il quale si fa il JOIN è sempre lo stesso.

Tags: sql select count union all inner join

Aggiungi commento


Codice di sicurezza
Aggiorna

Link Sponsorizzati.