Sql server SQL Pivot问题,需要动态列名
好的。因此,我们需要通过下面的代码获得输出。我从以下位置获得了大部分代码:。这会给我这些年的动态列名,然后统计每年的事件。我需要(或至少希望)将列名格式化为2014财年总计等,而不仅仅是2014财年。因此,创建了另一个列名列表,用作输出名称。我认为,在进行透视时,您将为新列提供自定义名称。我不确定我需要做什么Sql server SQL Pivot问题,需要动态列名,sql-server,pivot,pivot-table,Sql Server,Pivot,Pivot Table,好的。因此,我们需要通过下面的代码获得输出。我从以下位置获得了大部分代码:。这会给我这些年的动态列名,然后统计每年的事件。我需要(或至少希望)将列名格式化为2014财年总计等,而不仅仅是2014财年。因此,创建了另一个列名列表,用作输出名称。我认为,在进行透视时,您将为新列提供自定义名称。我不确定我需要做什么 DECLARE @colValues as NVARCHAR(MAX), @colNames as NVARCHAR(MAX), @query as NVA
DECLARE @colValues as NVARCHAR(MAX),
@colNames as NVARCHAR(MAX),
@query as NVARCHAR(MAX)
--Creates the column names dynamically from the FY results
select @colValues = STUFF((
SELECT ',' + QUOTENAME(FY)
From [dbo].[Table]
Group By FY
Order By FY desc
for xml path(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
select @colNames = STUFF((
SELECT ',' + '[FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'
From [dbo].[Table]
Group By FY
Order By FY desc
for xml path(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
--print(@cols)
--Creates the SQL Query using pivot with the dynamic columns
set @query = '
with temp1 as
(
Select a.EventType,
a.Days_Since_Last_Event,
row_number() over (partition by a.EventType order by a.Days_Since_Last_Event) as ranking
From
(
SELECT EventType
,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
FROM [dbo].[Table]
) a join
(
SELECT EventType
,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
FROM [dbo].[Table]
) b on a.EventType = b.EventType and a.Days_Since_Last_Event = b.Days_Since_Last_Event
), temp3 as
(
select EventType,
Days_Since_Last_Event
from temp1
where ranking = 1
), temp2 as
(
Select EventType
,'+ @colNames + '
From
(
Select EventType, FY, 1 as thing
From [dbo].[Table]
) a
Pivot
(
Count(thing)
for FY in (' + @colValues + ')
) b
)
Select t3.*, '+ @colNames +'
From temp3 t3
join temp2 t2 on t3.EventType = t2.EventType'
execute(@query);
在两个位置的temp2 cte中使用@colValues。。然后在最终选择中使用此选项
select @colNames = STUFF((
SELECT ',' + QUOTENAME(FY) + ' AS [FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'
From [dbo].[Table]
Group By FY
Order By FY desc
for xml path(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
我应该给你这样的东西
DECLARE @colValues as NVARCHAR(MAX),
@colNames as NVARCHAR(MAX),
@query as NVARCHAR(MAX)
--Creates the column names dynamically from the FY results
select @colValues = STUFF((
SELECT ',' + QUOTENAME(FY)
From [dbo].[Table]
Group By FY
Order By FY desc
for xml path(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
select @colNames = STUFF((
SELECT ',' + QUOTENAME(FY) + ' AS [FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'
From [dbo].[Table]
Group By FY
Order By FY desc
for xml path(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
--Creates the SQL Query using pivot with the dynamic columns
set @query = '
with temp1 as
(
Select a.EventType,
a.Days_Since_Last_Event,
row_number() over (partition by a.EventType order by a.Days_Since_Last_Event) as ranking
From
(
SELECT EventType
,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
FROM [dbo].[Table]
) a join
(
SELECT EventType
,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
FROM [dbo].[Table]
) b on a.EventType = b.EventType and a.Days_Since_Last_Event = b.Days_Since_Last_Event
), temp3 as
(
select EventType,
Days_Since_Last_Event
from temp1
where ranking = 1
), temp2 as
(
Select EventType
,'+ @colValues + '
From
(
Select EventType, FY, 1 as thing
From [dbo].[Table]
) a
Pivot
(
Count(thing)
for FY in (' + @colValues + ')
) b
)
Select t3.*, '+ @colNames +'
From temp3 t3
join temp2 t2 on t3.EventType = t2.EventType'
execute(@query);