CREATE TABLE score

(

name NVARCHAR(20),

subject NVARCHAR(20),

score INT

)

--2.插入测试数据

INSERT INTO score(name,subject,score) VALUES('张三','语文',98)

INSERT INTO score(name,subject,score) VALUES('张三','数学',80)

INSERT INTO score(name,subject,score) VALUES('张三','英语',90)

INSERT INTO score(name,subject,score) VALUES('李四','语文',88)

INSERT INTO score(name,subject,score) VALUES('李四','数学',86)

INSERT INTO score(name,subject,score) VALUES('李四','英语',88)

INSERT INTO score(name,subject,score) VALUES('李明','语文',60)

INSERT INTO score(name,subject,score) VALUES('李明','数学',86)

INSERT INTO score(name,subject,score) VALUES('李明','英语',88)

INSERT INTO score(name,subject,score) VALUES('林风','语文',74)

INSERT INTO score(name,subject,score) VALUES('林风','数学',99)

INSERT INTO score(name,subject,score) VALUES('林风','英语',59)

INSERT INTO score(name,subject,score) VALUES('严明','英语',96)

select * from score

select subject from score   for xml path('')

SELECT Subject+','  FROM score

    where name='林风'

  FOR XML PATH('')

 

   SELECT  cast(score as varchar)+',' FROM score

    where name='林风'

  FOR XML PATH('')

 

SELECT name ,sum(score),

(SELECT Subject+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS StuList,

 

 

  (SELECT cast(score as varchar(10))+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS StuList

 

 

FROM score A

GROUP BY name

--3.取每个学科的前3名数据

SELECT * FROM

(

SELECT subject,name,score,ROW_NUMBER() OVER(PARTITION BY subject ORDER BY score DESC) AS num FROM score

) T WHERE T.num <= 3 ORDER BY subject

--------------------------------------

SELECT * FROM

(

SELECT subject,name,score,Rank() OVER(PARTITION BY subject ORDER BY score DESC) AS num FROM score

) T WHERE T.num <= 3 ORDER BY subject

-----------------------------------------------

SELECT * FROM

(

SELECT subject,name,score,Dense_Rank() OVER(PARTITION BY subject ORDER BY score DESC) AS num FROM score

) T WHERE T.num <= 3 ORDER BY subject

-----------------------------------------------

/*以下是我对4个排名函数的类比表格:         

               排名连续性   排名并列性         

RANK()        不一定连续    有并列         

DENSE_RANK()   连续         有并列         

ROW_NUMBER()   连续         无并列         

NTILE()        连续         有并列         

*/

--4行转列

SELECT name,ISNULL([数学],0) [数学],ISNULL([英语],0) [英语],ISNULL([语文],0) [语文]

FROM score PIVOT (max(score) FOR subject IN ([数学],[英语],[语文]) ) AS pt

SELECT name,ISNULL([数学],0) [数学],ISNULL([英语],0) [英语]

FROM score PIVOT (max(score) FOR subject IN ([数学],[英语]) ) AS pt

SELECT Name AS 姓名 ,

     MAX(CASE Subject WHEN '数学' THEN score ELSE 0 END) [数学] ,

     MAX(CASE Subject WHEN '英语' THEN score ELSE 0 END) [英语] ,

     MAX(CASE Subject WHEN '语文'  THEN score ELSE 0 END) [语文]

   FROM score GROUP BY name

--5动态行转列

declare @sql varchar(8000)

--set @sql = 'select Name as ' + '姓名'

set @sql=''

select @sql = @sql+ ' , max(case Subject when ''' + Subject + ''' then score else 0 end) [' + Subject + ']'

from (select distinct Subject from score) as a

--set @sql = @sql + ' from score group by name'

print @sql

exec(@sql)

--6 动态Pivot

declare @sql varchar(500)

declare @sql2 varchar(500)

select @sql2=  isnull(@sql2 + ',' , '') + 'isnull(['+Subject+'],0) as '+Subject+'' from score group by Subject

select @sql = isnull(@sql + ',' , '') + '['+Subject+']' from score group by Subject

print @sql

print @sql2

exec ('select Name,'+@sql2+' from (

select Name,s.Score,Subject from score s

 

) a pivot (sum(Score) for Subject in (' + @sql + ')) b')

   

SELECT name,sum(score) score,

(SELECT Subject+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS StuList,

  (SELECT cast(score as varchar(10))+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS StuList

FROM score A

GROUP BY name

 


--7 XML PATH

   select b.name,b.score,

   LEFT(b.StuList,LEN(b.StuList)-1) StuList,

   LEFT(b.ScoreList,LEN(b.ScoreList)-1) ScoreList

    from (

    SELECT name,sum(score) score,

(SELECT Subject+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS StuList,

  (SELECT cast(score as varchar(10))+',' FROM score

  WHERE name=A.name

  FOR XML PATH('')) AS ScoreList

FROM score A

GROUP BY name ) b  order by score desc

  

  

Partition分组使用和行列转换的更多相关文章

  1. oracle行列转换函数的使用

    oracle 10g wmsys.wm_concat行列转换函数的使用: 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行 ...

  2. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  3. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  4. 如何用Pivot实现行列转换

    在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...

  5. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

  6. sql行列转换

    首先我们建立一张表,名为scoreInfo,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示.

  7. Oracle行列转换

    一.建表与插入数据 1.1.建表 create table kecheng ( id NUMBER, name ), course ), score NUMBER ); insert into kec ...

  8. 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)

    2013-8-20 1.    SQL查询表的行列转换/小计/统计(with  rollup,with cube,pivot解析) 在实际的项目开发中有很多项目都会有报表模块,今天就通过一个小的SQL ...

  9. SQL SERVER 中的行列转换小结

    1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...

随机推荐

  1. LED驱动简单设计

    1.步骤 2.核心代码 #define GPKCON 0X7F008800 #define GPKDAT 0X7F008808 light_led: ldr r0,=GPKCON ldr r1,=0x ...

  2. org.springframework.core.NestedIOException

    今天遇到的一个小异常,报错信息如下: 2013-11-13 10:00:32 org.apache.catalina.core.StandardContext listenerStart严重: Exc ...

  3. 洛谷P1518 两只塔姆沃斯牛 The Tamworth Two

    P1518 两只塔姆沃斯牛 The Tamworth Two 109通过 184提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 求数据 题目背景 题目描 ...

  4. Java基础学习(学习IT企业必读的324个JAVA面试题.pdf 整理)

    一.Java程序基础 javac 文件名.java    编译程序 java 类名               运行java程序 代码规范中,一下几点要注意: 包名:包名是全小写的名词,中间可以由点分 ...

  5. Java学习一

    Java程序的运行机制和JVM     JVM(java 虚拟机) Java Virtual Machine java语言比较特殊,由Java语言编写的程序需要经过编译步骤, JDK java SE ...

  6. lib制作

    生成模拟器和真机通用lib命令: lipo -create libKIF-os.a libKIF-simulator.a -output libKIF.a. 需要cd到  愿文件.a所在的目录. li ...

  7. python 基础知识(一)

    python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  8. 常用颜色的RGB值

    RGB颜色表 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:rgb(255,0,0) 绿色:rgb(0,255,0) 蓝色:rgb(0,0,255) 青色:rgb(0,25 ...

  9. 如何查找Mac上的USB存储设备使用痕迹

    最近刚好有个案子的证物主机是MBP, OS X版本为El Capitan,案况与营业秘密外泄有关,当中要找有关USB存储设备的使用痕迹. 要提醒大家的是,不同版本的OS X,各种迹证的存放文件名称及路 ...

  10. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...