sqlserver下将数据库记录的列记录转换成行记录的方法

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

姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
SQL 语句如下:


代码如下:

create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case Subject when '语文' then result else 0 end) 语文,
max(case Subject when '数学' then result else 0 end) 数学,
max(case Subject when '物理' then result else 0 end) 物理
from tb
group by name

--动态SQL,指subject不止语文、数学、物理这三门课程。

declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)

(0)

相关推荐

  • sqlserver 行列互转实现小结

    复制代码 代码如下: --行列互转 /****************************************************************************************************************************************************** 以学生成绩为例子,比较形象易懂 整理人:中国风(Roy) 日期:2008.06.06 *************************************

  • SQLServer行转列实现思路记录

    最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习.(面试题请参见附件) 相关的数据表: 1.Score表  2.[User]表  SQL语句如下: --方法一:静态SQL 复制代码 代码如下: SELECT * FROM (SELECT UID,Name, Score,ScoreName FROM Score,[User] WHERE Score.UID=[User].ID) AS SourceTable PIVOT(AVG(Sco

  • Sql Server 2000 行转列的实现(横排)

    我们用到的表结构如下: 三张表的关系为: 现有的测试数据为: 我们需要的结果是: 复制代码 代码如下: DECLARE @strSQL VARCHAR(8000) SET @strSQL = 'SELECT t.STUNAME [姓名]' SELECT @strSQL = @strSQL + ',SUM(CASE s.SNAME WHEN ''' + SNAME + ''' THEN g.[Score] END) [' + SNAME + ']' FROM (SELECT SNAME FROM

  • SQLServer行列互转实现思路(聚合函数)

    有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20), Subject nvarchar(20), Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 ); Insert into @t (StudentName,Subject,Score)

  • Sql Server 字符串聚合函数

    如下表:AggregationTable Id Name 1 赵 2 钱 1 孙 1 李 2 周 如果想得到下图的聚合结果 Id Name 1 赵孙李 2 钱周 利用SUM.AVG.COUNT.COUNT(*).MAX 和 MIN是无法做到的.因为这些都是对数值的聚合.不过我们可以通过自定义函数的方式来解决这个问题.1.首先建立测试表,并插入测试数据: 复制代码 代码如下: create table AggregationTable(Id int, [Name] varchar(10)) go

  • 深入学习SQL Server聚合函数算法优化技巧

    Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. 一.写在前面 如果有对Sql server聚合函数不熟或者忘记了的可以看我之前的一片博客. 本文中所有数据演示都是用

  • sqlserver2005 行列转换实现方法

    复制代码 代码如下: --Create Company Table Create Table Company ( ComID varchar(50) primary key, ComName nvarchar(50) not null, ComNumber varchar(50) not null, ComAddress nvarchar(200), ComTele varchar(50) ) --Create Product Table Create Table Product ( Produ

  • sqlserver下将数据库记录的列记录转换成行记录的方法

    假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成 姓名 语文 数学 物理 ---------- ----------- ----------- ----------- 李四 74 84 94 张三 74 83 93 SQL 语句如下: 复制代码 代码如下: create table tb ( Name varchar(10) , Subject varcha

  • python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    本文实例讲述了python使用xlrd实现检索excel中某列含有指定字符串记录的方法.分享给大家供大家参考.具体分析如下: 这里利用xlrd,将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件 import os import xlrd,sys # input the excel file Filename=raw_input('input the file name&path:') if not os.path.isfile(Filename): rais

  • 使用Shell 脚本实现每隔100行插入一条记录且记录第一列包含行号其他列不变

    1.例子:每隔100行插入一条记录,并且此条记录的第一列包含行号,其他列与第一行相同 #!/bin/sh var="00001" # 变量 cat a.txt|awk 'NR==1'|while read line # 获取文件第一行 do #echo "$line" result=`echo "$line"|cut -f2-` # 默认以tab分割,获取第二列至最后一列 cat a.txt|awk 'NR%100==0{printf("

  • Mysql 相邻两行记录某列的差值方法

    表结构: 数据: 需求: 按照company_id不同分组,然后分别求出相同company_id相邻记录touch_time的差值 SQL: select r1.company_id, r1.touch_time, r2.touch_time, r1.touch_time - r2.touch_time from (select (@rownum := @rownum + 1) as rownum, info.company_id, info.touch_time from sys_touch_

  • Oracle数据库"记录被另一个用户锁住"解决方法(推荐)

    1.先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作. 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X

  • sqlserver isnull在数据库查询中的应用

    isnull在数据库查询中的应用,特别是再语句连接的时候需要用到 比如连接时候,某个字段没有值但是又要左连接到其他表上 就会显示空, isnull可以判断是否是NULL,如果是给个默认值 isnull("字段名","默认的数据") SqlServer中的null值与IsNull函数NULL 值的三大特点,分别是:1)NULL值不参加统计:2)NULL值不进入计算表达式:3)不能与其它值进行比较. 所谓NULL值不参加统计 即 在使用统计函数时,凡是涉及到 NULL值

  • Linux系统下Oracle数据库的安装和启动关闭操作教程

    1.准备: df -H 查看空间剩余   一般准备最少5G 2.查看swap分区大小 du -sh /tmp/ 最少400M 3. 建组建用户 groupadd dba -g 111 groupadd oinstall -g 110 useradd oracle -u -110 -g 110 -G 111 passwd oracle --stdin 4. 设置参数 su - oracle vi .bash_profile export ORACLE_BASE=/u01/oracle export

  • C#使用SqlServer作为日志数据库的设计与实现

    前言 做一个简单的日志数据库 功能不需要特别繁琐 主要就是记录普通日志和错误日志(INFO,ERROR) 用数据库作为日志有好处也有坏处 相比于文本来说 更加容易操作 后期查看日志可以根据时间筛选 当然要求也多了点 没那么灵活了 首先你的PC上还要安装一个SqlServer 本来是想用log4net配置去实现的 发现配置很繁琐 决定自己设计一个 肯定有不少不足之处 分为以下几个步骤 1.建立日志数据表 都用一个表来存放,那么字段就要多设置一个 用来区分不同的日志类型 具体怎么设置 也很简单 字段

  • 系统高吞吐量下的数据库重复写入问题分析解决

    目录 问题分析 数据库上解决 从程序上保证数据不重复 总结 问题分析 为了提高系统的吞吐量,很多环节下对于数据库的写入是多线程,甚至是多进程的.为了保证写入成功,在很多情况下需要多次重试.这就会带来一个问题,数据重复,同一条数据会被记录多次.有些情况下数据重复无伤大雅,但是很多情况系统是无法容忍数据重复的.因此这个问题需要解决.我个人觉得解决这一问题有两个方向:第一,从数据库上保证数据不重复,第二,从程序上保证数据不重复. 数据库上解决 主要包括:主键,唯一性索引,甚至是临时表.程序上解决无非就

  • 详解SQLServer 2008 R2数据库SSAS建模及扩展能力

    SQLServer 2008 R2数据库中提供的SSAS建模工具包括包括SQL Server Management Studio 和Business Intelligence Development Studio,那么建模的过程是怎样的呢?本文我们就来介绍这些,接下来就让我们来一起了解一下SQLServer 2008 R2数据库的建模工具和关键过程以及数据挖掘.权限和访问接口等的知识吧. 建模工具和关键过程 SSAS的建模的目的是设计多维数据库对象,建模的工具包括SQL Server Manag

随机推荐