• SQL Server 行列转换(1)


    参考前一个SQL的行列转换例子http://www.cnblogs.com/insus/articles/1969896.html ,觉得不够自由,需要去预先知道记录的内容去定义行或列。

    下面这个方法,是Insus.NET常用一种处理方案,为数据量较少而准备。代码比较长,基本上写有说明,理解起来,一般不会有多大困难。

    代码如下: 

    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]
    (
        RId 
    NVARCHAR(2)
    )
    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        
            
    --把日期转换为字符串
            DECLARE @C NVARCHAR(10= CONVERT(NVARCHAR(10),@DT,112)
            
    --判断此次循环的日期作为临时表[dbo].[#rList]一个字段,如果不存在,修改这个临时表,增加字段,反之,将略去执行下面SQL语句        
            EXECUTE('IF NOT EXISTS(SELECT name FROM tempdb..syscolumns where id=OBJECT_ID(''tempdb..[#rList]'') AND tempdb..syscolumns.name ='''+ @C +''') ALTER TABLE tempdb..[#rList] ADD [' + @C + '] NVARCHAR(10)')
            
            
    --判断此次循环的记录在临时表是否存在,如果不存在
            IF NOT EXISTS (SELECT [RId] FROM [dbo].[#rList] WHERE [RId] = @RId)
            
            
    --插入此记录
            INSERT INTO [dbo].[#rList]([RId]VALUES (@RId)    
            
            
    --更新记录。
            EXECUTE('UPDATE [dbo].[#rList] SET ['+ @C +'] = '''+ @Hits +''' WHERE [RId] = '''+ @RId +'''')
            
    --循环下一笔
            SET @N = @N + 1
        
    END
    END
        
    --查询处理结果
        SELECT * FROM [dbo].[#rList]    

    执行结果:

  • 相关阅读:
    第一阶段冲刺第七天
    第一次冲刺第六天
    第十一周学习进度条
    第一阶段冲刺第五天
    《我们应该怎样做需求分析》阅读笔记
    个人总结
    第二阶段个人总结十
    第二阶段个人总结九
    第二阶段个人总结八
    第二阶段个人总结七
  • 原文地址:https://www.cnblogs.com/insus/p/1970577.html
Copyright © 2020-2023  润新知