Sql server Sql Server将行透视到列中,其余列的值相同

Sql server Sql Server将行透视到列中,其余列的值相同,sql-server,pivot,Sql Server,Pivot,我在SQL Server中有一个名为test的表,它有3列 请参考这张图片 使用此查询: IF OBJECT_ID('tempdb..#tblcolumn') IS NOT NULL DROP TABLE #tblcolumn create table #tblcolumn(PeriodName varchar(30), PeriodID int,accountid int) insert into #tblcolumn values('p1',1,110) insert into #tblco

我在SQL Server中有一个名为test的表,它有3列

请参考这张图片

使用此查询:

IF OBJECT_ID('tempdb..#tblcolumn') IS NOT NULL DROP TABLE #tblcolumn
create table #tblcolumn(PeriodName varchar(30), PeriodID int,accountid int)
insert into #tblcolumn values('p1',1,110)
insert into #tblcolumn values('p2',2,111)
insert into #tblcolumn values('p3',3,112)
insert into #tblcolumn values('p4',4,113)
insert into #tblcolumn values('p5',5,114)
insert into #tblcolumn values('p6',6,115)
insert into #tblcolumn values('p7',7,116)

select * from #tblcolumn

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
    DECLARE @colsWithNoNulls    NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(PeriodName) 
                    from #tblcolumn
                    group by PeriodName
                    order by PeriodName
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @cols

set @query = 'SELECT  accountid,'+@cols+' into #temp1 from  #tblcolumn             
            pivot 
            (
                sum(PeriodID)
                for PeriodName in (' + @cols + ')
            ) p '
            set @query = @query+ 'select * from #temp1'
execute(@query);
任何帮助都将不胜感激。谢谢。

您可以从输出中使用sum()over()来获得以下结果:

DECLARE @cols AS NVARCHAR(MAX),
        @Colsover AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
    DECLARE @colsWithNoNulls    NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(PeriodName) 
                    from #tblcolumn
                    group by PeriodName
                    order by PeriodName
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @Colsover = STUFF((SELECT ','+QUOTENAME(PeriodName) +' = sum('+ QUOTENAME(PeriodName) +') over()'
                    from #tblcolumn
                    group by PeriodName
                    order by PeriodName
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @cols
select @Colsover

set @query = 'SELECT accountid, '+ @Colsover+' from ( SELECT  *  from  #tblcolumn             
            pivot 
            (
                sum(PeriodID)
                for PeriodName in (' + @cols + ')
            ) p ) a ;'
           -- set @query = @query+ 'select * from #temp1'
execute(@query);
输出:

+-----------+----+----+----+----+----+----+----+
| accountid | p1 | p2 | p3 | p4 | p5 | p6 | p7 |
+-----------+----+----+----+----+----+----+----+
|       110 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       111 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       112 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       113 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       114 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       115 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
|       116 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
+-----------+----+----+----+----+----+----+----+

非常感谢你。你为我节省了很多时间。这是我期望的工作。非常感谢。欢迎,感谢接受答案,如果它有效谢谢