SQL Server 行列转换(2)

参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果:

SQL Server 行列转换(2)

 参考代码:

SQL Server 行列转换(2) View Code
BEGIN
    
IF   OBJECT_ID  ( ' [dbo].[#t] ' IS   NOT   NULL
    
DROP   TABLE   [ dbo ] . [ #t ]
    
CREATE   TABLE   [ dbo ] . [ #t ]
    (
        id 
INT   IDENTITY ( 1 , 1 ),   -- 产生唯一字段,稍后为循环使用
        RId  NVARCHAR ( 2 ),
        DT DATE,
        Hits 
INT
    )
    
-- 把需要处理的数据记录预存入这个临时表中
     INSERT   INTO   [ dbo ] . [ #t ]   SELECT   [ RId ] , [ DT ] , [ Hits ]   FROM   [ dbo ] . [ RecordHits ]     
END

-- 创建一个临时表,为处理记录所需要表最初表结构
BEGIN
IF   OBJECT_ID ( ' [dbo].[#rList] ' IS   NOT   NULL
DROP   TABLE   [ dbo ] . [ #rList ]
CREATE   TABLE   [ dbo ] . [ #rList ]
(
    DT DATE  
-- 此字段将确定是以日期为记录
)
END

BEGIN     
    
-- 宣告一些变量,为循环记录时所使用
     DECLARE   @N   INT   =   1 @R   INT
    
DECLARE   @RId   NVARCHAR ( 2 ), @DT  DATE
    
DECLARE   @Hits   INT
    
    
SET   @R   =  ( SELECT   MAX ( [ id ] FROM   [ dbo ] . [ #t ] )
    
WHILE   @N   <=   @R  
    
BEGIN
        
-- 取出每笔记录值
         SELECT   @RId   =   [ RId ] , @DT   =   [ DT ] , @Hits   =   [ Hits ]   FROM   [ dbo ] . [ #t ]   WHERE   [ id ]   =   @N         
        
        
-- 判断此次循环的记录RId作为临时表[dbo].[#rList]一个字段,如果不存在,修改这个临时表,增加字段,反之,将略去执行下面SQL语句        
         EXECUTE ( ' IF NOT EXISTS(SELECT name FROM tempdb..syscolumns where id=OBJECT_ID( '' tempdb..[#rList] '' ) AND tempdb..syscolumns.name = ''' +   @RId   + ''' ) ALTER TABLE tempdb..[#rList] ADD [ '   +   @RId   +   ' ] NVARCHAR(10) ' )
        
        
-- 判断此次循环的记录在临时表是否存在,如果不存在
         IF   NOT   EXISTS  ( SELECT   [ DT ]   FROM   [ dbo ] . [ #rList ]   WHERE   [ DT ]   =   @DT )
        
        
-- 插入此笔记录
         INSERT   INTO   [ dbo ] . [ #rList ] ( [ DT ] VALUES  ( @DT )    
        
        
-- 更新记录。
         EXECUTE ( ' UPDATE [dbo].[#rList] SET [ ' +   @RId   + ' ] =  ''' +   @Hits   + '''  WHERE [DT] =  ''' +   @DT   + '''' )
        
-- 循环下一笔
         SET   @N   =   @N   +   1
    
END -- 结束循环
END
    
-- 查询处理结果
     SELECT   *   FROM   [ dbo ] . [ #rList ]     

 

你可能感兴趣的:(SQL Server)