SQL Server中的dynamic数据透视表

你好,我有下面的表格,我希望把EcoYear转移到顶端,但是没有一定的年限,这些年可以随时开始。 另外,不同的情况会有不同的起始年份,所以我需要填0而不是null。

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 

这最初是用Access使用交叉表完成的。

One Solution collect form web for “SQL Server中的dynamic数据透视表”

这可以在SQL Server中使用UNPIVOTPIVOT 。 静态版本是您知道要转换的列的位置:

 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小提琴

dynamic版本将确定执行中的logging:

 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小提琴

  • SET autocommit = 1和mysql中的START TRANSACTION之间的区别(我错过了什么?)
  • 如何在Oracle数据库11g中创build新的模式/新用户?
  • MySQL WHERE:如何写“!=”或“不等于”?
  • SQL Server表:@,#和##有什么区别?
  • SQL Server中Oracle的RowID的等价物
  • MySQL将两列组合成一列
  • 什么是SQL(语言)的好替代品?
  • 在Update语句中使用表别名的好方法?