Ciao,
sfogliando il forum ho notato la tua interessante domanda.
Anch'io sono nuovo del forum quindi spero di non violare nessuna regola dedicandomi subito alla risposta senza passare da alcun thread di presentazione.
Penso che il tuo quesito sia più o meno questo: nel caso in cui FONDI_DIR avesse una riga per il 2015 o 2023 (colonne non incluse nella tua query PIVOT), come riesco a fare in modo che l'engine SQL lo capisca e mi "pivotti" anche questi valori?
Purtroppo il comando PIVOT in SQL Server non prevede alcun automatismo per questo tipo di cose. (vedi doc:
https://docs.microsoft.com/it-it/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver16)
La prima soluzione che mi viene in mente è far uso di SQL dinamico, ossia qualcosa di questo tipo:
DECLARE @anni NVARCHAR(MAX) = NULL;
DECLARE @sql NVARCHAR(MAX) = NULL;
SELECT @anni=ISNULL(@anni+',','')+QUOTENAME(ANNO_RIFERIM) FROM (
SELECT DISTINCT ANNO_RIFERIM FROM dbo.FONDI_DIR WHERE [DESC_TIPODIP] IN ('Dir. delle Profess. Sanitarie','Dirig.Sanitaria non medica','Dirig.Medico/Veterinaria')) A
ORDER BY ANNO_RIFERIM DESC
-- la variabile @anni conterrà tutti gli anni presenti nella FONDI_DIR per il tuo filtro di ricerca (in DISTINCT come avevi già intuito tu)
SELECT @anni;
-- preparo uno statement dinamico sql al quale concateno la lista degli anni recuperata nella query precedente
SET @sql = '
SELECT *
FROM (
SELECT [2022].[COD_VOCE],[2022].[DESCRIZIONE],[ANNO_RIFERIM],[IMPORTO] --,[FONDO_DIR],[TIPOLOGIA_DIR_SAN],[ANNO_RIFERIM],[ANNO_CEDOLINO],[IMPORTO]
FROM
[2022]
RIGHT join [dbo].[FONDI_DIR] ON [2022].[COD_VOCE]=[dbo].[FONDI_DIR].[COD_VOCE]
where [DESC_TIPODIP] IN (''Dir. delle Profess. Sanitarie'',''Dirig.Sanitaria non medica'',''Dirig.Medico/Veterinaria''))
AS SOURCEtable
PIVOT(SUM([IMPORTO]) FOR ANNO_RIFERIM IN ('+@anni+')
)
AS PIVOT_TABLE
';
-- eseguo il mio sql dinamico
EXEC(@sql);
PS. ricontrolla le colonne e la query all'interno della variabile SQL, potrei aver cambiato nomi tabelle o commentato delle colonne