为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server 行列转换(1)

标签:
SQL Server

参考前一个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]    

 

执行结果:

 

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消