Hello I have the following table and I want to pivot the EcoYear to be across the top but there aren't a set amount of years and the years could start anytime. In addition, different cases will have different starting years so I need it to pad 0 instead of null.
您好我有下表,我想将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
I need the table to look like this:
我需要这个表看起来像这样:
CaseID Item 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
38755 NetInv
38755 NetOil
38755 NetGas
This was originally done with Access using a crosstab.
这最初是使用交叉表使用Access完成的。
1 个解决方案
#1
14
This can be done in sql server using both an UNPIVOT
and then a PIVOT
. A Static version is where you know the columns to transform:
这可以在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
A Dynamic Version will determine the records on execution:
动态版本将确定执行时的记录:
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
#1
14
This can be done in sql server using both an UNPIVOT
and then a PIVOT
. A Static version is where you know the columns to transform:
这可以在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
A Dynamic Version will determine the records on execution:
动态版本将确定执行时的记录:
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