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

  • 列出在PostgreSQL中引用表的存储函数
  • 问题每一个好的数据库/ SQL开发人员应该能够回答
  • 致命错误:未捕获的exception“mysqli_sql_exception”与消息“在查询/准备语句中没有使用索引”
  • 何时去规范数据库devise
  • SQL SELECT行FROM表WHERE id = max(id)
  • 如何连接sql server中查询中的文本?
  • 对象'DF __ *'依赖于列'*' - 将int更改为double
  • DBCC CHECKIDENT将Identity设置为0
  • MySql - 更新string的一部分?
  • 如何在PHP脚本中正确构buildSQL查询?
  • 如何创build一个SQL Server函数来将多个行从一个子查询连接到单个分隔的字段?