zoukankan      html  css  js  c++  java
  • sql纵向表转成横向表

    declare @tab table(Class varchar(20),Student varchar(20),Course varchar(50),Grades decimal(7,2));
    insert into @tab(Class,Student,Course,Grades) values('A班','张三','语文',60);
    insert into @tab(Class,Student,Course,Grades) values('A班','张三','数学',70);
    insert into @tab(Class,Student,Course,Grades) values('A班','张三','英语',80);
    insert into @tab(Class,Student,Course,Grades) values('A班','李四','语文',30);
    insert into @tab(Class,Student,Course,Grades) values('A班','李四','数学',40);
    insert into @tab(Class,Student,Course,Grades) values('A班','李四','英语',50);
    insert into @tab(Class,Student,Course,Grades) values('B班','王五','语文',65);
    insert into @tab(Class,Student,Course,Grades) values('B班','王五','数学',75);
    insert into @tab(Class,Student,Course,Grades) values('B班','王五','英语',85);
    insert into @tab(Class,Student,Course,Grades) values('B班','赵六','语文',35);
    insert into @tab(Class,Student,Course,Grades) values('B班','赵六','数学',45);
    insert into @tab(Class,Student,Course,Grades) values('B班','赵六','英语',55);

    select * from @tab

    select
        (case when Grouping(Class)=1 then '总平均' when Grouping(Student)=1 then '' else Class end ) as Class
        ,(case when Grouping(Class)=1 then '' when Grouping(Student)=1 then '平均' else Student end) as Student
        ,cast(avg(语文) as decimal(7,2)) as 语文
        ,cast(avg(数学) as decimal(7,2)) as 数学
        ,cast(avg(英语) as decimal(7,2)) as 英语
        ,cast(avg(总分) as decimal(7,2)) as 总分
    from (
        select Class,Student
        ,(select isnull(sum(Grades),0) from @tab where class="t".Class and Student=t.Student and Course='语文') as '语文'
        ,(select isnull(sum(Grades),0) from @tab where class="t".Class and Student=t.Student and Course='数学') as '数学'
        ,(select isnull(sum(Grades),0) from @tab where class="t".Class and Student=t.Student and Course='英语') as '英语'
        ,(select isnull(sum(Grades),0) from @tab where class="t".Class and Student=t.Student) as '总分'
        from @tab as t
        group by Class,Student
        ) as tempTab
    group by Class,Student,语文,数学,英语,总分 with rollup
    having Grouping(语文)=1
        and Grouping(数学)=1
        and Grouping(英语)=1


    SQL语句之普通行列转换

    假设有张学生成绩表(Result)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三
    物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94


    建表:


    create TABLE TABLE1 (Name varchar(50),Subject varchar(50),Result int)

    INSERT INTO TABLE1 VALUES('张三','语文','73')
    INSERT INTO TABLE1
    VALUES('张三','数学','83')
    INSERT INTO TABLE1 VALUES('张三','物理','93')
    INSERT
    INTO TABLE1 VALUES('李四','语文','74')
    INSERT INTO TABLE1
    VALUES('李四','数学','84')
    INSERT INTO TABLE1 VALUES('李四','物理','94')



    想变成
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94


    declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select
    @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end)
    ['+Subject+']'
    from (select distinct Subject from TABLE1) as a
    set @sql =
    @sql + ' from TABLE1 group by name'
    exec(@sql)


    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94


    想变成


    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四
    数学  84
    李四 物理  94


    select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
    select 姓名 as
    Name,'数学' as Subject,数学 as Result from CJ union
    select 姓名 as Name,'物理' as
    Subject,物理 as Result from CJ
    order by 姓名 desc

  • 相关阅读:
    Flink sql 写 Hbase 忽略空列
    python协程系列(一)——生成器generator以及yield表达式详解
    Python中可迭代对象,迭代器和生成器的异同点
    Python生成器: send函数、close函数与yield关键字协作
    sqlalchemy的基本用法
    Windows10激活后又提示未激活解决办法
    parseaddr函数和formataddr函数的用法
    VisualStudio Code Remote 调试方法(错误Containers Docker version 17.12.0 or later required.)
    SpringBoot Jar Windows CMD 运行卡顿
    使用Aspose.cells(java)将excel转为图片等
  • 原文地址:https://www.cnblogs.com/51net/p/2824510.html
Copyright © 2011-2022 走看看