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

  • SQL Server:空VS空string
  • Oracledate“之间”查询
  • 我如何比较SQL Server中的时间?
  • 从命令行执行SQL脚本
  • 为什么要通过一个耗费大量内存的大型Django QuerySet进行迭代?
  • “where 1 = 1”语句
  • CASE .. WHEN在Oracle SQL中expression
  • 相当于SQLServer的函数SCOPE_IDENTITY()在mySQL中?
  • 如何在.net应用程序中使用SQL Server时间数据types?
  • PostgreSQL列名是否区分大小写?
  • 每个SQL Server外键都应该有一个匹配的索引?