在sql中透视表数据

时间:2017-05-17 08:20:35

标签: sql sql-server pivot

我有这样的数据

mystring=mystring[mystring.find('*'):]

但我想要这样的数据

id      Amount      coluName    
13        25000         abccol  
13        2300          defcol  

查询

id        abccol   defcol
13      25000     2300

如何通过枢轴来做到这一点?在这里不仅有两个名字(abccol,defcol)还有很多其他名字,但我这里只用了这两个

2 个答案:

答案 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(指定正确的数据类型,我将intnumericvarchar作为示例):

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