2012-09-14 54 views
5

您好,我有以下表格,并且我希望将EcoYear转换为跨越顶端,但是没有一定的年限,并且这些年份可以随时开始。另外,不同的情况会有不同的起始年份,所以我需要它填0而不是null。
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 

我需要的表看起来像这样:

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

这与访问使用交叉最初完成的。

+0

简短的回答 - 不要在SQL Server中执行此操作,而是在您用于呈现数据的任何应用程序中执行此操作。 –

+0

我的任务是在SQL Server中执行它,因为开发人员无法在新版本中使用Access。谢谢! –

+0

搜索“动态sql”“Pivot”应该告诉你如何去做。试试看,并回来的任何问题 – podiluska

回答

14

这可以在sql server中使用UNPIVOT然后PIVOT完成。静态版本是你知道的列转变:

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

动态版本将确定执行记录:

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

谢谢。这正是我需要做的。此动态版本是否能够为可能在2006年以后开始的其他案例添加更多列?例如,如果它在2008年开始,它将出现到2022年,但对于2006年和2007年的列将显示零。并感谢您的帮助。我将用它作为我的其他报告的基础! –

+0

@RolandP它会为您在“EcoYear”中的任何字段添加列,然后您可以根据需要限制年份。 – Taryn