2012-09-14 20 views
5

Ciao, ho la seguente tabella e voglio ruotare l'EcoYear in modo che sia tra i primi ma non ci sono un numero stabilito di anni e gli anni potrebbero iniziare in qualsiasi momento. Inoltre, i diversi casi avranno diversi anni di inizio, quindi ho bisogno di riempire 0 anziché null.
Tabella pivot dinamica in SQL Server

CaseID EcoYear NetInv NetOil NetGas 
38755 2006 123  2154   525 
38755 2007 123  2154   525 
38755 2008 123  2154   525 
38755 2009 123  2154   525 
38755 2010 123  2154   525 
38755 2011 123  2154   525 
38755 2012 123  2154   525 
38755 2013 123  2154   525 
38755 2014 123  2154   525 
38755 2015 123  2154   525 
38755 2016 123  2154   525 
38755 2017 123  2154   525 
38755 2018 123  2154   525 
38755 2019 123  2154   525 
38755 2020 123  2154   525 

Ho bisogno il tavolo per assomigliare a questo:

CaseID Item 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 
38755 NetInv 
38755 NetOil 
38755 NetGas 

Questo è stato originariamente fatto con Access utilizzando un campo incrociato.

+0

Breve risposta - Non farlo in SQL Server, fallo in qualsiasi applicazione tu stia utilizzando per presentare i dati. –

+0

Il mio compito è farlo in SQL Server perché gli sviluppatori non possono usare Access nella nuova versione. Grazie! –

+0

Una ricerca per "dynamic sql" "Pivot" dovrebbe mostrarti come farlo. Provalo e torna con eventuali problemi – podiluska

risposta

14

Questo può essere fatto in sql server usando sia un UNPIVOT e poi uno PIVOT. Una versione statica è dove sai che le colonne di trasformare:

select * 
from 
(
    select CaseId, EcoYear, val, item 
    from yourtable 
    unpivot 
    (
    val 
    for Item in (NetInv, NetOil, NetGas) 
)u 
) x 
pivot 
(
    max(val) 
    for ecoyear in ([2006], [2007], [2008], [2009], [2010], [2011], 
       [2012], [2013], [2014], [2015], [2016], [2017], 
       [2018], [2019], [2020]) 
) p 

vedere SQL Fiddle with Demo

una versione dinamica determinerà i record durante l'esecuzione:

DECLARE @colsPivot AS NVARCHAR(MAX), 
    @colsUnpivot as NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(EcoYear) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') and 
       C.name LIKE 'Net%' 
     for xml path('')), 1, 1, '') 


set @query 
    = 'select * 
     from 
     (
     select caseid, ecoyear, val, col 
     from yourtable 
     unpivot 
     (
      val 
      for col in ('+ @colsunpivot +') 
     ) u 
    ) x1 
     pivot 
     (
     max(val) 
     for ecoyear in ('+ @colspivot +') 
    ) p' 

exec(@query) 

vedere SQL Fiddle with Demo

+0

Grazie. Questo è esattamente quello che dovevo fare. Questa versione dinamica sarà in grado di aggiungere colonne aggiuntive per altri casi che potrebbero iniziare in un secondo momento rispetto al 2006? Per esempio, se fosse iniziato nel 2008, sarebbe uscito nel 2022, ma per le colonne con 2006 e 2007 mostrerà solo gli zeri. E grazie per il tuo aiuto. Userò questo come base per i miei altri rapporti! –

+0

@RolandP aggiungerà colonne per qualunque campo tu abbia nel tuo 'EcoYear', puoi quindi limitare gli anni se necessario. – Taryn