venerdì 27 giugno 2025

#ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

 #ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

POSTED BY GIULIANO PAGNINI, 27GIU 2025

Addestramento del Domain-constrained SQL Generation Framework di ImpolyzerDataStudio.

Case studios

Esempi di classiche domande:
"elenco dei contribuenti morosi", "elenco dei contribuenti che non hanno pagato", "utenti che non hanno pagato", "anagrafiche in mora", "elenco dei contribuenti che hanno pagato in ritardo", "elenco dei contribuenti con pagamenti tardivi", "utenti che hanno pagato in ritardo","per ogni contribuente il dovuto di occupazione","per ogni contribuente il dovuto di pubblicità"
Nei DB di esempio ho due comuni H231 e G911 con le tabelle interessate:
<COMUNE>UTENTI con le anagrafiche dei contribuenti 
<COMUNE>(E)REGISTRO<ANNO> con tutte le tipologie di tributo (occupazioni e pubblicità) per ogni contribuente
<COMUNE>(E)_PUB<ANNO> elenco dei bollettini emessi nell'esercizio 
<COMUNE>(E)CODIFICA<ANNO> le tipologie di tributo (variabili ogni anno) (TIPOCOD = 0 pubblicitò TIPOCOD = 1 occupazione )

Dalle domande si estraggono le chiavi semantiche e si creano le associazioni (Es. utente, contribuente, ect fanno riferimento sempre alla tabella UTENTI, Dovuto ad esempio fa riferimento sia al campo IMPORTO che alla tabella REGISTRO) 



 non hanno pagato, morosi ,in mora, hanno pagato in ritardo



pagamenti in ritardo


per ogni contribuente il dovuto di occupazione


per ogni contribuente il dovuto di pubblicità"


mappato dovuto su campo IMPORTO



Come risponde alle domande? 
Es. per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025.
Per comodità escludo i campi delle tabelle

{ "tags": [ "SQL", "FIREDAC", "FIREBIRD 3.0+" ], "question": "per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025", "constraints": [ "Usa solo SQL compatibile con FIREBIRD 3.0+", "Non usare alias o funzioni non supportate da FIREBIRD 3.0+", "Utilizza solo i nomi dei campi effettivamente presenti nelle tabelle indicate", "ignora il campo ENTE in tutte le tabelle" ], "tables": { "G911ECODIFICA2025": { }, "G911EREGISTRO2025": { }, "G911UTENTI": { } }, "semantic_mapping": { "CONTRIBUENTE": "UTENTI", "DOVUTO": "IMPORTO", "OCCUPAZIONE": { "REGISTRO": "REGISTRO.IDCODIFICA IN (SELECT COD FROM dynamic_codifica WHERE TIPOCOD = 1)" } }, "placeholders": { "dynamic_codifica": "[[COMUNE]]CODIFICA{{ANNO}}" } }
Es. per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025.
    

il JSON estratto

{ "tags": [ "SQL", "FIREDAC", "FIREBIRD 3.0+" ], "question": "elenco dei contribuenti che non hanno pagato nel comune G911 anno 2025", "constraints": [ "Usa solo SQL compatibile con FIREBIRD 3.0+", "Non usare alias o funzioni non supportate da FIREBIRD 3.0+", "Utilizza solo i nomi dei campi effettivamente presenti nelle tabelle indicate", "ignora il campo ENTE in tutte le tabelle" ], "tables": { "G911E_PUB2025": { }, "G911E_PUBD2025": { }, "G911UTENTI": { } }, "semantic_mapping": { "CONTRIBUENTI": "UTENTI", "NON HANNO PAGATO": "IDUTENTE IN (SELECT dynamic_bollettini WHERE Pagato IS NULL or Pagato = 0)" }, "placeholders": { "dynamic_bollettini ": "[COMUNE]]_PUB{{ANNO}}" } }

Con questo risultato:

sql
SELECT 
    u.IDUTENTE,
    u.RAGIONE_SOCIALE,
    u.RAGIONE_SOCIALE1,
    u.INDIRIZZO,
    u.NUMERO,
    u.CAP,
    u.P_IVA,
    u.COD_F,
    u.TEL,
    u.EMAIL,
    u.PEC,
    u.CATEGORIA
FROM G911UTENTI u
WHERE EXISTS (
    SELECT 1
    FROM G911E_PUB2025 p
    WHERE p.IDUTENTE = u.IDUTENTE
      AND (p.PAGATO IS NULL OR p.PAGATO = 0)
      AND p.ANNO = 2025
)
ORDER BY u.RAGIONE_SOCIALE

Buon lavoro!!

Nessun commento:

Posta un commento