2012-09-14 5 views
5

Hallo Ich habe die folgende Tabelle und ich möchte die EcoYear über die Spitze zu drehen, aber es gibt keine festgelegte Anzahl von Jahren und die Jahre könnten jederzeit beginnen. Außerdem werden verschiedene Fälle unterschiedliche Anfangsjahre haben, daher brauche ich 0 anstatt Null.
Dynamische Pivot-Tabelle 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 

Ich brauche die Tabelle wie folgt aussehen:

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

Das ursprünglich mit Zugriff über eine Kreuztabelle durchgeführt wurde.

+0

Kurze Antwort - Tun Sie dies nicht in SQL Server, sondern in jeder Anwendung, die Sie zum Präsentieren der Daten verwenden. –

+0

Meine Aufgabe besteht darin, dies in SQL Server zu tun, da die Entwickler Access in der neuen Version nicht verwenden können. Vielen Dank! –

+0

Eine Suche nach "dynamic sql" "Pivot" sollte Ihnen zeigen, wie es geht. Versuchen Sie es, und kommen Sie mit allen Problemen zurück – podiluska

Antwort

14

Dies kann in SQL Server mit einem UNPIVOT und dann einem PIVOT erfolgen. Eine statische Version ist, wo Sie die Spalten kennen zu transformieren:

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 

siehe SQL Fiddle with Demo

Eine dynamische Version der Datensätze wird bestimmen, auf die Ausführung:

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) 

siehe SQL Fiddle with Demo

+0

Vielen Dank. Genau das musste ich tun. Kann diese dynamische Version zusätzliche Spalten für andere Fälle hinzufügen, die möglicherweise zu einem späteren Zeitpunkt als 2006 beginnen? Zum Beispiel, wenn es 2008 begann, würde es bis 2022 gehen, aber für die Spalten mit 2006 und 2007 werden nur Nullen angezeigt. Und danke für deine Hilfe. Ich werde das als Grundlage für meine anderen Berichte verwenden! –

+0

@RolandP es fügt Spalten für alle Felder, die Sie in Ihrem 'EcoYear' haben, hinzu, Sie können dann die Jahre nach Bedarf einschränken. – Taryn