我有这样的数据
mystring=mystring[mystring.find('*'):]
但我想要这样的数据
id Amount coluName
13 25000 abccol
13 2300 defcol
查询
id abccol defcol
13 25000 2300
如何通过枢轴来做到这一点?在这里不仅有两个名字(abccol,defcol)还有很多其他名字,但我这里只用了这两个
答案 0 :(得分:2)
这可能适合你。 用户 @jarlh 在评论中说您需要指定您正在使用的SQL Server版本时是正确的。
declare @cols as nvarchar(max)
, @query as nvarchar(max)
select @cols = stuff((select distinct ',' + quotename(coluName) from #t for xml path(''), type ).value('.', 'nvarchar(max)') ,1,1,'')
set @query = 'select id, ' + @cols + '
from #t
pivot ( max(amount) for coluName in (' + @cols + ') ) p '
select @query
execute sp_executesql @query;
因此,我们的想法是在您的桌面上使用简单的PIVOT
,旋转列coluName
。每次动态获取的值,因为您没有coluName
值的静态列表。
您可以查看有关动态旋转here的详细说明。
您可以查看此查询的工作版本here。
修改强>:
要在评论中回答您的问题,可以像这样使用相同的表#t(指定正确的数据类型,我将int
,numeric
和varchar
作为示例):
if object_id('tempdb..#t') is not null drop table #t
create table #t (id int, amount numeric, coluName varchar(10))
insert into #t
select e.id, e.Amount, i.ColuName
from FixAm e inner join InCo i on i.CCode = e.CCode
where i.cid = 49
然后只需使用上面的动态数据透视。
答案 1 :(得分:0)
IF Object_id('tempdb..#tempTab') IS NOT NULL
Drop table #tempTab
;WITH Cte(id,Amount,coluName )
AS
(
Select 13,25000,'abccol' UNION ALL
Select 13,2300, 'defcol'
)
SELECT * INTO #tempTab FROM cte
Declare @Columns nvarchar(max), @Sql nvarchar(max)
SELECT @Columns=STUFF((SELECT DISTINCT ', '+ QuoteName(coluName) FROM #tempTab
FOR XML PATH ('')),1,1,'') from #tempTab
--SELECT @Columns
SET @Sql='SELECT [id],'+@Columns+'From
(
SELECT id,Amount,coluName
from #tempTab
)
AS Src
Pivot
(
MAX(Amount) For coluName IN ('+@Columns +')
)Pvt '
Print @Sql
EXecute (@Sql)
输出
id abccol defcol
-------------------
13 25000 2300