2012-09-14 49 views
5

Merhaba Aşağıdaki tabloya sahibim ve EcoYear'ı üstte olacak şekilde döndürmek istiyorum ancak belirli bir süre yok ve yıllar her an başlayabilir. Ayrıca, farklı durumlar farklı başlangıç ​​yıllarına sahip olacak, bu yüzden null yerine 0'a ihtiyacınız var.
SQL Server'da Dinamik Pivot Tablo

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 

Böyle bakmak tablo gerekir:

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

Bu aslında bir çapraz tabloyu kullanarak Access ile yapıldı.

+0

Kısa cevaba bakınız - Bunu SQL Server'da yapmayın, verileri sunmak için kullandığınız herhangi bir uygulamada yapın. –

+0

Görevim, SQL Server'da bunu yapmaktır çünkü geliştiriciler Access'i yeni sürümde kullanamazlar. Teşekkürler! –

+0

"Dinamik sql" "Pivot" için bir arama, nasıl yapılacağını göstermelidir. Deneyin ve – podiluska

cevap

14

Bu, hem bir UNPIVOT hem de bir PIVOT kullanarak sql sunucusunda yapılabilir.

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 

SQL Fiddle with Demo

Bir Dinamik Sürüm yürütme kayıtları belirleyecek bkz: sütunları dönüştürmeye biliyorum nerede bir statik sürümüdür

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) 

SQL Fiddle with Demo

+0

Teşekkür ederim. Tam olarak yapmam gereken şey bu. Bu dinamik sürüm, 2006'dan daha sonraki bir tarihte başlayabilecek diğer durumlar için ek sütun ekleyebilecek mi? Örneğin, eğer 2008'de başlamış olsaydı, 2022'ye çıktı, ancak 2006 ve 2007'ye sahip sütunlar için sıfırlar gösterecek. Ve yardımın için teşekkür ederim. Bunu diğer raporlarım için temel olarak kullanacağım! –

+0

@RolandP, 'EcoYear'ınızda sahip olduğunuz alanlar için sütunlar ekleyecektir, daha sonra yıllar olarak gerektiği gibi kısıtlayabilirsiniz. – Taryn