PIVOT SQL GENERAZIONE AUTOMATICA FOR

di il
2 risposte

PIVOT SQL GENERAZIONE AUTOMATICA FOR

Buona sera,
è il mio primo post in questo sito, premetto che non sono un programmatore ma un economista che ha spesso a che fare con excel powerbi powerquery sql e saltuariamente phyton; dico questo a premessa in modo che possiate essere tolleranti verso il mio codice malconcio e da autodidatta.
vi vorrei chiedere se è possibile generare automaticamente le intestazioni di colonna senza doverle inserire manualmente.
questo è il codice ed è funzionante:
SELECT* FROM(
SELECT [2022].[COD_VOCE],[2022].[DESCRIZIONE],[FONDO_DIR],[TIPOLOGIA_DIR_SAN],[ANNO_RIFERIM],[ANNO_CEDOLINO],[IMPORTO]
  FROM [AOB].[dbo].[2022]
  right join [dbo].[FONDI_DIR]
  on [AOB].[dbo].[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 (
[2022],
[2021],
[2020],
[2019],
[2018],
[2017],
[2016]))
AS PIVOT_TABLE
vorrei rendere gli i campi ANNO_RIFERIM autogenerati, nella mia ignoranza ho provato con un distinct(anno_riferim) ma non funziona; esistono modi per fare quello che cerco?
spero di essere riuscito a farmi comprendere in caso di necessità di ulteriori informazioni non esitate a chiedere.

Saluti

2 Risposte

  • Re: PIVOT SQL GENERAZIONE AUTOMATICA FOR

    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
  • Re: PIVOT SQL GENERAZIONE AUTOMATICA FOR

    Ti ringrazio tanto, c'è qualcosa che non va ma me la studio per riuscire a farla funzionare grazie mille.
Devi accedere o registrarti per scrivere nel forum
2 risposte