Sql 行转列问题总结

1、行转列---1、最简单的行转列
/*    问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94想变成(得到如下结果): 
姓名 语文 数学 物理 
李四 74   84   94
张三 74   83   93
*/
--测试用
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) 
--通过动态构建@sql,得到如下脚本
select 姓名 as 姓名 ,max(case 课程 when '语文' then 分数 else 0 end) 语文,max(case 课程 when '数学' then 分数 else 0 end) 数学,max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
--得到SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--查询结果
/*
姓名         数学          物理          语文          
---------- ----------- ----------- ----------- 
李四         84          94          74
张三         83          93          74(所影响的行数为 2 行)
*/--2 加合计
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分 
---- ---- ---- ---- ------ ----
李四 74   84   94   84.00  252
张三 74   83   93   83.33  250
*/--SQL SERVER 2000 静态SQL。
select 姓名 姓名,max(case 课程 when '语文' then 分数 else 0 end) 语文,max(case 课程 when '数学' then 分数 else 0 end) 数学,max(case 课程 when '物理' then 分数 else 0 end) 物理,cast(avg(分数*1.0) as decimal(18,2)) 平均分,sum(分数) 总分
from tb
group by 姓名--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m , 
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')
 
其他实例http://topic.csdn.net/u/20100708/18/55df5a90-27a7-4452-a69a-27f735539a1f.html?seed=24842417&r=66831902#r_66831902--3、不同数据按照序号转为列,方法基本同 1if object_id('tb1') is not null drop table tb1
go
CREATE table tb1 --数据表
(
cpici varchar(10) not null,
cname varchar(10) not null,
cvalue int null 
)
--插入测试数据
INSERT INTO tb1 values('T501','x1',31)
INSERT INTO tb1 values('T501','x1',33)
INSERT INTO tb1 values('T501','x1',5)INSERT INTO tb1 values('T502','x1',3)
INSERT INTO tb1 values('T502','x1',22)
INSERT INTO tb1 values('T502','x1',3)INSERT INTO tb1 values('T503','x1',53)
INSERT INTO tb1 values('T503','x1',44)
INSERT INTO tb1 values('T503','x1',50)
INSERT INTO tb1 values('T503','x1',23)--在sqlserver2000里需要用自增辅助
alter table tb1 add id int identity
go
declare @s varchar(8000)
set @s='select cpici '
select @s=@s+',max(case when rn='+ltrim(rn)+' then cvalue end) as cvlue'+ltrim(rn)
from (select distinct rn from (select rn=(select count(1) from tb1 where cpici=t.cpici and id<=t.id) from tb1 t)a)t
set @s=@s+' from (select rn=(select count(1) from tb1 where cpici=t.cpici and id<=t.id),* from tb1 t
) t group by cpici'
 
exec(@s)
go
alter table tb1 drop column id --再2005就可以用row_number
declare @s varchar(8000)
set @s='select cpici '
select @s=@s+',max(case when rn='+ltrim(rn)+' then cvalue end) as cvlue'+ltrim(rn)
from (select distinct rn from (select rn=row_number()over(partition by cpici order by getdate()) from tb1)a)t
set @s=@s+' from (select rn=row_number()over(partition by cpici order by getdate()),* from tb1
) t group by cpici'
 
exec(@s)---结果
/*
cpici      cvlue1      cvlue2      cvlue3      cvlue4
---------- ----------- ----------- ----------- -----------
T501       31          33          5           NULL
T502       3           22          3           NULL
T503       53          44          50          23
警告: 聚合或其他 SET 操作消除了空值。(3 行受影响)*/--测试用
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(电话号码 varchar(15), 通话时长 int ,行业 varchar(10))
insert tb
select '13883633601', 10 ,'餐饮' union all
select '18689704236', 20 ,'物流' union all
select '13883633601', 20 ,'物流' union all
select '13883633601', 20 ,'汽车' union all
select '18689704236', 20 ,'医疗' union all
select '18689704236', 20 ,'it' union all
select '18689704236', 20 ,'汽车' union all
select '13883633601', 50 ,'餐饮'
godeclare @sql varchar(8000)
set @sql='select 电话号码,sum(通话时长) 通话总和'
select @sql=@sql+',max(case when rowid='+ltrim(rowid)+' then 行业 else '''' end) as [行业'+ltrim(rowid)+']'
from (select distinct rowid from (select (select count(distinct 行业) from tb where 电话号码=t.电话号码 and 行业<=t.行业) rowid
from tb t) a) b
set @sql=@sql+' from ( select * , (select count(distinct 行业) from tb where 电话号码=t.电话号码 and 行业<=t.行业) rowid
from tb t ) t group by 电话号码'
exec(@sql)--结果
/*(所影响的行数为 8 行)电话号码            通话总和        行业1        行业2        行业3        行业4        
--------------- ----------- ---------- ---------- ---------- ---------- 
13883633601     100         餐饮         汽车         物流         
18689704236     80          it         汽车         物流         医疗(所影响的行数为 2 行)*/另一种动态行转列:http://topic.csdn.net/u/20100612/10/4CFCB667-89FA-4985-90D5-B8A420A6FF12.htmlif object_id('[tb]') is not null drop table [tb]
go   
create table [tb]([姓名] varchar(1),[部门] varchar(4),[学历] varchar(4),[出生年月] datetime)
insert [tb]
select 'A','后勤','高中','1986-1-1' union all
select 'B','后勤','初中','1984-3-7' union all
select 'C','管理','本科','1987-2-1' union all
select 'D','操作','专科','1976-2-1' union all
select 'E','操作','专科','1943-2-1'   
goGO
if object_id('GetGroupByCol') is not null drop proc GetGroupByCol
go
create  PROCEDURE [dbo].[GetGroupByCol]
@colm nvarchar(100)AS
declare @sql varchar(4000)set @sql='
declare @sql varchar(8000)
set @sql=''select 部门''
select @sql =@sql+ '', sum(case ltrim('+@colm+') when ''''''+ltrim(' + @colm + ')+'''''' then 1 else 0 end) 
[''+ltrim(' + @colm + ')+'']'' from (select distinct '+@colm+' from tb where '+@colm+' is not null) as a
set @sql = @sql + '' from tb group by 部门''
exec(@sql)'
 
exec(@sql)
GOexec GetGroupByCol N'学历'
exec GetGroupByCol N'出生年月'
exec GetGroupByCol N'姓名'/*(所影响的行数为 5 行)部门   本科          初中          高中          专科          
---- ----------- ----------- ----------- ----------- 
操作   0           0           0           2
管理   1           0           0           0
后勤   0           1           1           0(所影响的行数为 3 行)部门   02  1 1943 12:00AM 02  1 1976 12:00AM 03  7 1984 12:00AM 01  1 1986 12:00AM 02  1 1987 12:00AM 
---- ------------------ ------------------ ------------------ ------------------ ------------------ 
操作   1                  1                  0                  0                  0
管理   0                  0                  0                  0                  1
后勤   0                  0                  1                  1                  0(所影响的行数为 3 行)部门   A           B           C           D           E           
---- ----------- ----------- ----------- ----------- ----------- 
操作   0           0           0           1           1
管理   0           0           1           0           0
后勤   1           1           0           0           0(所影响的行数为 3 行)
*/以下可参考的例子1、普通多表联合http://topic.csdn.net/u/20100623/00/077055eb-784d-4b27-8407-2c17adc06c60.html?seed=81934135&r=66426155#r_66426155
 
http://topic.csdn.net/u/20100622/19/9710803c-441b-45d0-b010-703a2633fe89.html?471612、多表根据时间 计算序号
http://topic.csdn.net/u/20100623/12/bbb0921b-0e1b-4435-8e85-959d87844954.html?seed=2145286087&r=66438763#r_66438763
http://topic.csdn.net/u/20100701/09/1684649b-b893-463b-8b40-7f4b894cd41e.html?seed=205688256&r=66630774#r_666307743、财务相关
http://topic.csdn.net/u/20100626/00/83499112-43ae-4caa-a1fd-268cc5138da6.html?seed=415671352&r=66513615#r_665136154、根据行数转列http://topic.csdn.net/u/20100705/12/e325571b-c368-4174-859f-17ae708eca3d.html
 
http://topic.csdn.net/u/20100706/09/c34728dc-6167-45df-b7cf-974612b9aa8b.html
 
http://topic.csdn.net/u/20100706/16/f217deed-a2be-4950-b911-2624ac7a881a.html?394455、根据排序大小转http://topic.csdn.net/u/20100707/13/63f4a02e-ebc3-4c71-9380-d6b2ca0eb366.html?399706、分组排序按序号转http://topic.csdn.net/u/20100725/05/7f813114-c423-4759-97b8-b22e1e2e90d7.html?seed=471594449&r=67220945#r_67220945
 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx

 

转载于:https://www.cnblogs.com/douqiumiao/p/3406342.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻找第K大的数字

寻找第k大的数字&#xff0c;有很多方法&#xff0c;最基本的就是将数组按照从大到小的顺序排列&#xff0c;找出第k个元素即可。但是这种方法的时间复杂度为o(nlog(n)),我们还能找到更好地方法。下面我们将介绍另外两种办法&#xff0c;一种是基于快排Partition的方法&#xf…

(12)MSP430F5529 常用内置函数和一些说明

&#xff08;1&#xff09; MSP430F5529支持最高工作频率为25MHZ&#xff0c;也就是说你通过 锁相环倍频来提高系统运行速度是有一个限制的&#xff0c; 最高只能到25MHZ&#xff08;再高没意思了&#xff09;。 &#xff08;2&#xff09;几个重要的内联函数 &#xff08;内联…

从零开始学android编程_android初学者的入门秘籍

大概是去年年底开始接触android原本是学习嵌入式的我&#xff0c;领导让我看看能不能搞一下这个android APP。一开始的我懵逼得很。。。这android APP 不是得用java写吗&#xff1f;&#xff1f;&#xff1f; 现在我看网上说比较多还是用kotlin&#xff0c;没去学。。。好家伙&…

修改了sql默认路径无法登录服务器,PostgreSQL错误'无法连接到服务器:没有这样的文件或目录'...

像其他一些人一样,当我在我的项目中运行rake db:migrate或者甚至为我的Ruby on Rails 3.2应用程序尝试大多数数据库任务时,我收到此错误.PGError(无法连接到服务器:没有这样的文件或目录.服务器是否在本地运行并接受Unix域套接字上的连接"/tmp/.s.PGSQL.5432"&#x…

QMarkDowner编译

第一次完整的编译一个工程。哈哈 记录一下 准备环境 我的环境是win7 x64, python2.7.5 x64的。 python 3.x的我没试过,有需要的朋友可以试一下。 安装python2.7.5 x64 确保将安装路径加入到Path中 PyQt4 啊 我的环境是win的 当然要下win版 (PyQt4-4.10.3-gpl-Py2.7-Qt4.8.5-x6…

C++ STL的查找算法

假设你有一个序列容器&#xff0c;或者有一对迭代器标识了一个区间,现在你希望在容器中查找一些信息&#xff0c;这样的查找工作如何进行呢&#xff1f;你的选择往往是&#xff1a; count,count_if,find,find_if,binary_search,lower_bound,upper_bound,equal_range.该如何选择…

习题七

umask 022 &#xff0c;请描述该命令的含义创建目录时默认的权限为&#xff1a;755 rwxr-xr-x创建文件时默认的权限为&#xff1a;644 rw-r--r--note:创建文件的默认权限是拿掉了X 所以最大为666&#xff0c;而目录最大为777 umask NUM 就是去掉相应的权限转载于:https://blo…

web中的cookie管理

本篇是以JSP为背景介绍&#xff0c;但是在web开发中也是相同的原理。 什么是cookie 由于http是一种无状态的协议&#xff0c;因此服务器收到请求后&#xff0c;只会当做一次新的请求。即便你重复发送了1000次同样的请求&#xff0c;这1000次都属于独立的请求。 这样显然效率很低…

unity怎么设置游戏页面_杭州有没有正规的unity游戏开发培训机构?

现在Unity游戏开发是个火热的行业&#xff0c;薪资待遇比较高&#xff0c;未来的发展方向和前景也比较不错&#xff0c;很多人也都想成为专业Unity游戏开发工程师&#xff0c;学习Unity游戏开发已经成为很多追求更好就业前景的人的选择。学习专业、系统的Unity游戏开发知识并达…

VC++ 使用attributes定义接口

1.定义预处理命令_ATL_ATTRIBUTES 2.在一个全局的Cpp文件里面配置module的attribute [module(dll, uuid "{3845951F-15B8-4286-8E7D-E9D4F5C7B6CE}", name "TestApp")]3.定义接口 [object,uuid("9F414A8A-1D5E-4aff-A60E-CFD65155ABB6"),dual,…

h3c 虚拟服务器 下一跳,H3CNE 312题和313题 直连路由静态路由的下一跳问题

321.在MSR 路由器上看到路由表里有如下显示&#xff1a; Destination/Mask Proto Pre Cost NextHop Interface 127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0 127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0 192.168.96.0/19 Direct 0 0 192.168.120.153 S6/0 那么关于目的地321.在MS…

C++成员变量的初始化顺序问题

先来看两道题&#xff1a; // count algorithm example #include <iostream> // std::cout #include <algorithm> // std::count #include <vector> // std::vector using namespace std; class A { public:A() { cout << "in A()&q…

Knockout.Js案例一Introduction

在这第一个教程中,您将体验的一些基本知识构建的web UI Model-View-ViewModel使用knockout.js(MVVM)模式。案例1&#xff1a;添加:data-bind <p>First name: <strong data-bind"text:firstName">1</strong></p><p>Last name: <stro…

C#注册表常用操作

1&#xff1a;加键 改值 Microsoft.Win32.RegistryKey Key Microsoft.Win32.Registry.CurrentUser.CreateSubKey( "Software\Microsoft\Internet Explorer\Main"); Key.SetValue( "Window Title" , value ); Key.Close(); …

谷歌浏览器外贸版_做外贸快两个月,没有单怎么办?

Hello 大家好&#xff0c;我是Jack。今天给大家更新一篇在知乎看到的外贸问题&#xff1a;做外贸快两个月&#xff0c;没有单怎么办?外贸这个话题在知乎算是小众话题了&#xff0c;相比较于职场&#xff0c;英语学习&#xff0c;国际政治&#xff0c;IT等&#xff0c;这些话题…

React Native通信机制详解

http://blog.cnbang.net/tech/2698/ React Native是facebook刚开源的框架&#xff0c;可以用javascript直接开发原生APP&#xff0c;先不说这个框架后续是否能得到大众认可&#xff0c;单从源码来说&#xff0c;这个框架源码里有非常多的设计思想和实现方式值得学习&#xff0c…

C++11系列学习之四----auto

在哪些情况下要申明类型&#xff1a; 定义变量类型 函数返回值&#xff0c;函数参数 表达式返回变量类型 auto关键字原理 在定义变量的时候必须申明类型&#xff0c;c是强语言类型&#xff0c;在编译阶段需要知道类型&#xff0c;这样的好处是程序效率更高&#xff0c;而…

windows 自动copy远程服务器文件

net use h: \\123.45.67.000\T1dbbackup 123456/user:administrator ------远程服务器IP123.45.67.000 。T1dbbackup&#xff1a;共享文件夹 。 h :映射到本机的盘符。 用户名&#xff1a;administrator&#xff0c;密码&#xff1a;123456copy h:\*.* f:\T1DB ------复…

eclipse 不能切换输入法

按了AltShift键&#xff1f;再按一次把EN切换成CN&#xff0c;然后再CtrlShift就可以切换输入法转载于:https://www.cnblogs.com/jiayonghua/p/3413827.html

excel打开2个独立窗口_谢楠称女性独立的不是钱是心 谢楠与吴京婚后生育2个儿子...

近日&#xff0c;在综艺节目《幸福三重奏》 三日谈妻子篇中&#xff0c;谢楠被问到如何看待独立女性时&#xff0c;反问记者会不会问吴京同样的问题&#xff1b;随后回答道&#xff0c;女性独立的不是钱&#xff0c;而是你的心&#xff1b;楠姐的回答超级霸气了&#xff0c;你们…