【发布时间】:2019-03-30 10:27:06
【问题描述】:
如何将行转换为列并为每列创建不同的名称?
create table #TempTable (InvoiceNum int,State varchar(2), ChargeName varchar(50), PercentageRate decimal(5,3), FlatRate decimal(5,2))
insert into #TempTable values (235736, 'AZ','Inspection & Policy Fee', NULL,250.00)
,(235736, 'AZ','Surplus Line Tax',0.03,NULL)
,(235736, 'AZ','Stamping Fee',0.002,NULL
)
我需要这样的东西:
更新:
使用示例我能够对其进行反透视,但结果不是我想要的:
create table #TempTable (InvoiceNum int,State varchar(2), ChargeName varchar(50), PercentageRate decimal(5,3), FlatRate decimal(5,2))
insert into #TempTable values (235736, 'AZ','Inspection & Policy Fee', NULL,250.00)
,(235736, 'AZ','Surplus Line Tax',0.03,NULL)
,(235736, 'AZ','Stamping Fee',0.002,NULL)
--select * from @TempTable
Declare @SQL nvarchar(max),
@query nvarchar(max)
select @SQL = STUFF((SELECT ',' + QUOTENAME(ChargeName)
from #TempTable
group by ChargeName, InvoiceNum
order by InvoiceNum
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
--select @SQL
set @SQL = 'SELECT ' + @SQL + ' from
(
select PercentageRate, ChargeName
from #TempTable
) x
pivot
(
max(PercentageRate)
for ChargeName in (' + @SQL + ')
) p '
exec sp_executesql @SQL;
更新:
运行下面的查询给了我这个:
为什么 ChargeName 不在第一行?我希望看到它是这样的:我错过了什么?
declare @TempTable table (InvoiceNum int,StateID varchar(2), ChargeName varchar(50), PercentageRate decimal(5,3), FlatRate decimal(5,2))
insert into @TempTable values (235736, 'AZ','Inspection & Policy Fee', NULL,250.00)
,(235736, 'AZ','Surplus Line Tax',0.03,NULL)
,(235736, 'AZ','Stamping Fee',0.002,NULL)
select
InvoiceNum,
ChargeName,
StateID,
PercentageRate,
FlatRate,
row_number() over (partition by InvoiceNum order by ChargeName) as RN
into #TempTable
from @TempTable #TempTable
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(RN)
FROM (SELECT DISTINCT RN FROM #TempTable) AS RN
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT InvoiceNum, ' + @ColumnName + '
FROM #TempTable
PIVOT(MAX(ChargeName)
FOR RN IN (' + @ColumnName + ')) AS PVTTable'
EXEC sp_executesql @DynamicPivotQuery
drop table #TempTable
【问题讨论】:
-
如果您仍然认为这不是重复的,请尝试使用 row_number 为 Tax1、Tax2.. 添加一个计算列,然后使用上面的链接来实现您正在寻找的结果。
-
谢谢。我用那个例子来达到某个目的。但是很困惑如何修改它以获得理想的结果。我更新了问题。再次感谢
-
这将需要多个枢轴并且变得非常丑陋。我展示了如何做动态列here,但我认为它需要你做 3 次
标签: sql-server tsql pivot dynamic-sql