2017-05-10 15 views
1

我在SQL Server表名爲test的有3列Sql Server的數據透視行轉換成列隨着列的其餘部分相同值

請參考此圖像。 Click to view

使用此查詢:

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,'[email protected]+' into #temp1 from #tblcolumn    
      pivot 
      (
       sum(PeriodID) 
       for PeriodName in (' + @cols + ') 
      ) p ' 
      set @query = @query+ 'select * from #temp1' 
execute(@query); 

任何幫助,將不勝感激。謝謝。

回答

1

可以使用在SUM()()從你的輸出得到的結果如下:

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 | 
+-----------+----+----+----+----+----+----+----+ 
+0

非常感謝你。你節省了我很多時間。這是根據我的預期工作。非常感謝。 – user3044462

+0

歡迎,欣賞接受答案,如果它的作品謝謝 –