zoukankan      html  css  js  c++  java
  • SQL多行转多列

    --★转换结果如上图

    1、首先创建表:

    CREATE TABLE [成绩表](
    [编号] [int]IDENTITY(1,1) NOT NULL,
    [姓名] [varchar](50)NULL,
    [语文] [numeric](5, 2)NULL,
    [数学] [numeric](5, 2)NULL,
    [英语] [numeric](5, 2)NULL
    ) ON [PRIMARY]

    2、插入测试数据

    INSERT INTO 成绩表([姓名],[语文],[数学],[英语])
    VALUES('道一',80,100,90.8),('老二',48,56,60),('张三',88,78,90),('李四',80,90,95),('王五',67,68,56),('刘六',77,68,80)

    3、执行语句进行行列转换

    declare @sql_1 varchar(8000)
    select @sql_1=''
    select @sql_1= @sql_1 + 'select [编号],[姓名],['+name+'] AS ''成绩'','''+name+''' AS ''课程'' from 成绩表 union all '
    from syscolumns where id=object_id('成绩表')  and CHARINDEX(name,'编号,姓名')=0
    select @sql_1= @sql_1 + ' select distinct null,null,null,null from 成绩表 ' 
    --注意!多一行 selectdistinct null,null,null,null from 成绩表     不加会报union all错误
    print @sql_1
    declare @sql_2 varchar(8000)
    select @sql_2='select [课程] '
    select @sql_2=@sql_2 + ',SUM(case when [姓名] = '''+[姓名]+''' then 成绩 else 0 end) '''+[姓名]+''' '
    from 成绩表
    select @sql_2=@sql_2 + ' from ( '+@sql_1 +') as tb where ISNULL([编号],'''')<>'''' group by [课程]'
    print @sql_2
    execute(@sql_2)

    执行行列转换后的结果如图:

    4、继续添加一些数据

    INSERT INTO 成绩表([姓名],[语文],[数学],[英语])
    VALUES('鬼七',67,68,56),('王八',77,68,80)

    5、继续执行步骤3的脚本,动态查询随表变化,结果如图:

  • 相关阅读:
    数据结构之链表——加里森的任务(循环链表)
    数据结构之队列——回文字判断
    数据结构之栈——二进制转十进制
    《爱的艺术》人类超越了本能
    从一个Activity返回上一个Activity
    VS(C++)编程遇到的错误集合
    C++(MFC)编程一些注意事项
    Tomcat部署(进行web服务器开发)
    本地IP与宽带IP
    opencv的Mat图像显示在MFC控件中
  • 原文地址:https://www.cnblogs.com/tianguook/p/4512975.html
Copyright © 2011-2022 走看看