Partition分组使用和行列转换
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分组使用和行列转换的更多相关文章
- oracle行列转换函数的使用
oracle 10g wmsys.wm_concat行列转换函数的使用: 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行 ...
- SQL行列转换6种方法
在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...
- SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)
SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...
- 如何用Pivot实现行列转换
在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...
- 在Sqlserver下巧用行列转换日期的数据统计
在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...
- sql行列转换
首先我们建立一张表,名为scoreInfo,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示.
- Oracle行列转换
一.建表与插入数据 1.1.建表 create table kecheng ( id NUMBER, name ), course ), score NUMBER ); insert into kec ...
- 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
2013-8-20 1. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 在实际的项目开发中有很多项目都会有报表模块,今天就通过一个小的SQL ...
- SQL SERVER 中的行列转换小结
1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...
随机推荐
- 洛谷P1470 最长前缀 Longest Prefix
P1470 最长前缀 Longest Prefix 73通过 236提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 求大神指导,为何错? 题目描述 在生 ...
- 洛谷P1215 [USACO1.4]母亲的牛奶 Mother's Milk
P1215 [USACO1.4]母亲的牛奶 Mother's Milk 217通过 348提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 ...
- python中set和frozenset方法和区别
set(可变集合)与frozenset(不可变集合)的区别:set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素 ...
- android屏幕基础知识
首先,先来上一张图,看看android屏幕分辨率的占比情况 什么是dp,dip,dpi,sp.px ?之间的关系是什么? px:构成图像的最小单位 dp/dip:密度无关像素 以160dpi为基准 1 ...
- 正宗PC Unix实验环境
首先解释一下PCUNIX环境,在PC服务器上可以安装多种UNIX系统例如ScoUnix,SunSolarisx86系统,BSD系统等等,但是唯一应用在生产系统(例如邮政储蓄,证券和某些银行前置机等)的 ...
- 【SSH 1】SSH框架的基本理解
导读:在结束了BS之后,接触到的第一个项目算是网上商城了.这次用到了和之前都不一样的框架:SSH.这个项目就和之前学牛腩一样,有着里程碑的意义.当然了,这也就意味着,什么都是新鲜的,接触到的东西,有时 ...
- 在ax中怎么对enum类型循环取其中每一个值
static void test(Args _args) { DictEnum dictEnum; int i,nextPos; EnumId enumId; ; enumId = EnumNum(S ...
- [转载]:Endnote 自定义style文件的默认位置
一般而言,安裝完EndNote 後,預設Output Styles.Filters.Connection Files 的電腦存放路徑如下– C:\Program Files\EndNote X4 ...
- MYSQL--事务处理
1.用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql的自动提交模式 MYSQL默认是 ...
- JS常用的设计模式(9)——策略模式
策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...