sql纵向表转成横向表

简介: declare @tab table(Class varchar(20),Student varchar(20),Course varchar(50),Grades decimal(7,2));insert into @tab(Class,Student,Course,Grades) va...

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

目录
相关文章
|
4月前
|
SQL
幂等修改表增加一列的sql语句
这个 SQL 查询用于修改名为 `t1` 的表,通过添加一个名为 `b` 的新列,并指定数据类型。`IF NOT EXISTS` 子句确保只有在表中不存在该列的情况下才会添加。 在你的查询中,`<数据类型>` 应该被替换为你想要的具体数据类型(例如,INT,VARCHAR等)。以下是使用 INT 数据类型的示例: ```sql ALTER TABLE t1 ADD COLUMN IF NOT EXISTS b INT; ``` 请根据你的需求选择合适的数据类型。这个查询的作用是在表 `t1` 中添加一个名为 `b` 的新列,如果该列尚不存在的话。
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
110 1
|
1月前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
60 11
|
2月前
|
SQL
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
41 0
|
6天前
|
SQL 数据库
Sql server 表管理(创建 修改 删除)
Sql server 表管理(创建 修改 删除)
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】——用SQL语句实现数据库和基本表的创建
【MySQL】——用SQL语句实现数据库和基本表的创建
79 3
【MySQL】——用SQL语句实现数据库和基本表的创建
|
4月前
|
SQL Oracle 关系型数据库
SQL 的 with as 临时中间表
SQL 的 with as 临时中间表
|
4月前
|
SQL 数据库
SQL-修改表操作
SQL-修改表操作
|
4月前
|
SQL 存储 关系型数据库
SQL语句-表操作
SQL语句-表操作
|
4月前
|
SQL Java 数据库连接
这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
【1月更文挑战第17天】【1月更文挑战第85篇】这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
23 8