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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

MySQL(五)DQL之排序查询

2034
来自专栏软件测试经验与教训

数据库基础知识

1063
来自专栏HansBug's Lab

2748: [HAOI2012]音量调节

2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 719  Solve...

2968
来自专栏GopherCoder

Python 强化训练: 第一篇

2444
来自专栏数说工作室

3. call PRXSUBSTR () | 庖丁解牛切割数据!

【SAS Says·扩展篇】庖丁解牛割数据! | 3. call PRXSUBSTR () 0. 前集回顾 1. 新的问题 2. 初识 PRXSUBSTR() ...

3555
来自专栏数据结构与算法

1142 奖学金 sort做法

个人博客:doubleq.win 1142 奖学金 2007年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白...

2865
来自专栏ATYUN订阅号

NLP教程:用Fuzzywuzzy进行字符串模糊匹配

在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术。换句话说,字符串模糊匹配...

2253
来自专栏ACM算法日常

水果(STL+排序)- HDU 1263

夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样J...

921
来自专栏数据结构与算法

P1538 迎春舞会之数字舞蹈

题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列。 为了配合每...

2917
来自专栏专知

【 关关的刷题日记50】 Leetcode 345. Reverse Vowels of a String

关关的刷题日记50 – Leetcode 345. Reverse Vowels of a String 题目 Write a function that ta...

2673

扫码关注云+社区

领取腾讯云代金券