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. 如何用Pivot实现行列转换

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

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

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

  4. sql行列转换

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

  5. Oracle行列转换

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

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

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

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

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

  8. SQL行列转换:报表_公司采购表_每个公司各采购了些什么产品

    有同学问了个比较典型行列转换的问题,想想,解答如下:数据库有一张表: 是个公司采购表,想转化成如下报表,显示每个公司各采购了些什么产品: 哪些公司采购哪些产品是不确定的,所以报表的列有哪几项是不确定的 ...

  9. Sql2008的行列转换之行转列

    今天在工作的时候遇到了行列转换的问题,记得去年有一段时间经常写,但是许久不用已经记不太得了.好记性不如烂笔头,忙完之后赶紧记录一下. 关键字:PIVOT(行转列),UNPIVOT(列转行) 先说说 P ...

随机推荐

  1. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  2. POI导出excel日期格式

    参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...

  3. android 多媒体数据库详解(转)

    转自:http://www.2cto.com/kf/201309/242876.html 主要分为几节: 1. Android的媒体文件内部是如何存储的? 2. Andoid的媒体文件如何获取? 3. ...

  4. 写给java开发的运维笔记

    转载至:https://github.com/biezhi/java-bible/tree/master/learn_server

  5. 【SQL】sql版Split函数。用于拆分字符串为单列表格

    功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环 ...

  6. 25佳漂亮的结婚邀请 &amp; 婚礼请柬网站设计

    互联网给我们的生活带来了巨大的变化,越来越多的事情可以通过网络完成.下面向大家分享一组结婚邀请网站以及婚礼请柬网站的设计案例,如果你也正想制作这样的网站,相信这些优秀案例能够带给你很大的帮助. 您可能 ...

  7. GO语言练习:多返回值函数

    1.代码 2.运行 1.代码 package main import ( "fmt" "strconv" ) func getValue(n int) (flo ...

  8. Winform开发框架之介绍

    winform开发框架,尽量减少程序员在界面中的代码量和工作量,Model自动生成,界面以及控件自动生成,简单的逻辑自动生成.自动生成的界面已经实现简单逻辑增删改查功能. 其他开发框架都已经或多火烧实 ...

  9. python算法:rangeBitwiseAnd(连续整数的与)

    def rangeBitwiseAnd(self, m, n): i = 0 while m != n: m >>= 1 n >>= 1 i += 1 return n < ...

  10. Intellij idea安装设置