create table t(name varchar(),subject varchar(),mark int)
insert into t
select 'A','語文', union all
select 'A','數學', union all
select 'A','外語', union all
select 'B','數學', union all
select 'B','外語', union all
select 'C','語文', --在使用动态变量的时候 不能使用动态的表
--答案一
declare @sql varchar(),@count int
select @count=count(distinct subject) from T
set @sql='select name'
select @sql=@sql+',sum(case when subject='''+subject+''' then mark else 0 end) as '+subject
from T
group by subject select @sql=@sql+',sum(isnull(mark,0))/'+rtrim(@count)+' as [avg] from t group by name'
exec(@sql)
/*
name 外語 語文 數學 avg
---- ----------- ----------- ----------- -----------
A 80 80 80 80
B 80 0 80 53
C 0 78 0 26
*/
drop table t
--答案二
create table tb(name varchar(),subject varchar(),mark int) insert into tb values('A', '语文', )
insert into tb values('A', '数学', )
insert into tb values('A', '外语', )
insert into tb values('B', '数学', )
insert into tb values('B', '外语', )
insert into tb values('C', '语文', ) select name ,
max(case subject when '语文' then mark else end) '语文',
max(case subject when '数学' then mark else end) '数学',
max(case subject when '外语' then mark else end) '外语',
sum(mark)/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg]
from tb
group by name declare @sql varchar()
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then mark else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' ,sum(mark)/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg] from tb group by name'
exec(@sql) drop table tb

[SQL]多列的行转列的更多相关文章

  1. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  2. Sql server 中将数据行转列列转行(二)

    老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...

  3. Oracle中用一条Sql实现任意的行转列拼接 多行拼接

    表结构和数据如下(表名Test): NO VALUE NAME 1 a 测试1 1 b 测试2 1 c 测试3 1 d 测试4 2 e 测试5 4 f 测试6 4 g 测试7 Sql语句: selec ...

  4. SQL两列数据,行转列

    SQL中只有两列数据(字段1,字段2),将其相同字段1的行转列 转换前: 转换后: --测试数据 if not object_id(N'Tempdb..#T') is null drop table ...

  5. Sql server 中将数据行转列列转行(一)

    在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...

  6. SQL SERVER pivot(行转列),unpivot(列转行)

    [pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...

  7. SQL面试题之行转列

    典型的课程表: mysql> select * from course; +----+------------+----------+------------+ | id | teacher_i ...

  8. sql里的多行多列转一行多列小技巧

    ---恢复内容开始--- [ 今天下午接受了一个紧急小任务,是将一组比赛记录统计出来,将象棋游戏玩家的两条记录在一行里面显示,进数据库看之后是首先想到的是行转列,但是一开始就觉得不对,后来写到一半确实 ...

  9. Sqlserver 列转行 行转列

    sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生 ...

  10. mysql列转行 行转列

    列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...

随机推荐

  1. wikioi 1205 单词倒排

    /*====================================================================== 1205 单词翻转 题目描述 Description ...

  2. ubutntu apt 源

    中国开源软件中心更新服务器(北京光环新网 服务器),包含其他开源镜像: deb http://mirrors.oss.org.cn/ubuntu/ vivid main restricted univ ...

  3. CentOS6.4系统启动失败故障排查

    转:http://www.centoscn.com/CentosBug/osbug/2014/1028/4011.html 操作系统启动失败如下图报错: 故障现象: 从图中可以看到,操作系统启动的过程 ...

  4. Dom选择器及操作文本内容

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  5. angularjs实现IOS8自带计算器

    最近看到一则面试题目,要求使用angularjs实现一个计算器,利用放假时间实现了一个仿iOS8风格的计算器,功能基本和iOS自带的计算器是一致的. 查看demo,接着给出实现过程. 首先创建angu ...

  6. final,static

    如果输入参数在方法体执行过程中,强制不能被修改,那么参数类型前加final比较安全. final修饰的函数会被编译器优化,优化意味着编译器可能将该方法用内联(inline)方式载入.final修饰变量 ...

  7. Eclipse中新建jsp文件访问页面时乱码问题

    新建.jsp文件,charset和pageEncoding默认是ISO-8859-1,这样的话访问页面时会出现乱码,解决办法:将charset和pageEncoding改为UTF-8(或者GBK/GB ...

  8. 并行计算之OpenMP中的任务调度

    本文参考<OpenMP中的任务调度>博文,主要讲的是OpenMP中的schedule子句用法. 一.应用需求 在OpenMP并行计算中,任务调度主要用于并行的for循环.当for循环中每次 ...

  9. Eclipse换常用的快捷键

    还是喜欢ctrl+tab键来切换窗口,ctrl+f6实在不好使. 修改方法:在eclipse中Window -> Perferences -> General -> Keys -&g ...

  10. 【解决方案】: hyper-v 导入虚拟机报这个错误 32784

    从win server 2012创建的虚拟机 导出后, 想导入到本机win8系统上,结果报错 32784, google了一堆,都说不支持... 实际上 1.在win8系统上 新建一个不带硬盘的虚拟机 ...