SQL语句 自连表查询。inner join用法,partition by ,列转行查询
use mydb1
go
-- 表T_Employee2
-- Id Name Position Dept
-- 1 张三 员工 市场部
-- 2 李四 经理 销售部
-- 3 王五 经理 市场部
-- 4 马六 员工 销售部
-- 5 钱七 员工 市场部
select * from T_Employee2 -- 需求:查询表中所有员工以及所在部门的经理姓名。(使用表自连接查询) -- 分析:要求返回结果
-- Name Position Dept 经理
-- 张三 员工 市场部 王五
-- 马六 员工 销售部 李四
-- 钱七 员工 市场部 王五 -- 1、查出 每个部门对应的经理姓名
select Dept,Name from T_Employee2 where Position='经理'
-- 结果:
-- Dept Name
-- 销售部 李四
-- 市场部 王五 -- 2、查出 所有的员工
select * from T_Employee2 where Position='员工'
-- 结果:
-- Id Name Position Dept
-- 1 张三 员工 市场部
-- 4 马六 员工 销售部
-- 5 钱七 员工 市场部 --3、上面2个表连接查询,把1个表当做2个表来查询。
select t1.Name,Position,t1.Dept,t2.Name '经理' from
(select * from T_Employee2 where Position='员工') as t1
inner join (select Dept,Name from T_Employee2 where Position='经理')as t2 on t1.Dept = t2.Dept --4、简化后结果
select t1.Name,Position,t1.Dept,t2.Name '经理' from T_Employee2
as t1
inner join (select Dept,Name from T_Employee2 where Position='经理')as t2 on t1.Dept = t2.Dept
where t1.Position='员工' -- 结果:
-- Name Position Dept 经理
-- 张三 员工 市场部 王五
-- 马六 员工 销售部 李四
-- 钱七 员工 市场部 王五
记录开窗函数分组查询
--自连表查询
select t.A,t.B,t.C,t.D from T_D as t
inner join (select B,row_number() over(order by MIN(A)) as E from T_D group by B) tt on t.B=tt.B
order by tt.E
select * from T_D order by min(A) over(partition by B)
下面是列转行
go
if OBJECT_ID('tempdb..#temp') is not null
drop table #temp
create table #temp(fnum int, fa int, fb int)
insert into #temp values
(15070, 1, 3),
(15070, 2, 0),
(15070, 3, 3),
(15070, 4, 1),
(15070, 5, 0),
(15070, 7, 1),
(15070, 8, 1),
(15070, 9, 1),
(15070, 10, 0), (15071, 1, 3),
(15071, 2, 0),
(15071, 3, 1),
(15071, 4, 3),
(15071, 5, 0),
(15071, 7, 3),
(15071, 8, 1),
(15071, 9, 3),
(15071, 10, 3), (15072, 1, 3),
(15072, 2, 3),
(15072, 3, 0),
(15072, 4, 1),
(15072, 5, 0),
(15072, 7, 1),
(15072, 8, 0),
(15072, 9, 0),
(15072, 10, 0)
go
--select * from #temp
--请求转化成:
--fnum 1 2 3 4 5 7 8 9 10
--15070 3 0 3 1 0 1 1 1 0
--15071 3 0 1 3 0 3 1 3 3
--15072 3 3 0 1 0 1 0 0 0 select * from (select distinct fnum from #temp) as A
OUTER APPLY
(select [fbs]= replace(replace(
(select fb as value FROM #temp as B
where fnum = A.fnum order by B.fa FOR XML AUTO
),'<B value="',''),'"/>',' ')
)B --创建新表
go
if OBJECT_ID('tempdb..#new') is not null
drop table #new
create table #new(fnum int,l_1 int,l_2 int,l_3 int,l_4 int,l_5 int,l_7 int,l_8 int,l_9 int,l_10 int) --循环导入数据
declare @i int = 1;
declare @count int = (select count(*) from (select distinct fnum from #temp) as a);
declare @fnum varchar(50),@fbs varchar(50),@sql varchar(100); while @i<=@count
begin select @fnum=fnum, @fbs=fbs from
(select fnum,fbs,ROW_NUMBER() over(order by fnum) as row from (select distinct fnum from #temp) as A
OUTER APPLY
(select [fbs]= replace(replace(
(select fb as value FROM #temp as B
where fnum = A.fnum order by B.fa FOR XML AUTO
),'<B value="',''),'"/>',' ')
)B)tmp
where tmp.row = @i; set @sql='insert into #new values('+@fnum+',';
set @sql=@sql + replace(@fbs,' ',',')+')';
set @sql=replace(@sql,',)',')');
exec (@sql) --执行SQL
--PRINT @sql set @i=@i+1
end go select * from #new select fnum,
max(case fa when 1 then fb end) F1,
max(case fa when 2 then fb end) F2,
max(case fa when 3 then fb end) F3,
max(case fa when 4 then fb end) F4,
max(case fa when 5 then fb end) F5,
max(case fa when 7 then fb end) F7,
max(case fa when 8 then fb end) F8,
max(case fa when 9 then fb end) F9,
max(case fa when 10 then fb end) F10
from #temp group by fnum
SQL语句 自连表查询。inner join用法,partition by ,列转行查询的更多相关文章
- SQL语句之 多表管理
SQL语句之 多表管理 一个数据库内通常会有不止一张表,有时候我们要把多张表联系起来,这就需要用到多表管理的语句. 1.外键约束 一个表中的非主键字段,如果在另外一张表中是主键,那么这个字段我们叫它做 ...
- 使用sql语句获取数据库表的信息
下面的sql语句可以查看表的信息.其中modify_date和create_date可以根据表的修改时间来查看.如果不需要删除后,就能看到所有表的字段信息 ) PERCENT d.name AS 表名 ...
- sql语句中----删除表数据drop、truncate和delete的用法
sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table tb --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...
- (转载)用SQL语句创建Access表
<来源网址:http://www.delphifans.com/infoview/Article_220.html>用SQL语句创建Access表 很久以前弄的,用了一天的时间,没有什么技 ...
- ylb:sql语句重命名表名和列名
ylbtech-SQL Server:SQL Server-sql语句重命名表名和列名 sql语句重命名表名和列名 ylb:sql语句重命名表名和列名 返回顶部 一.更改数据库名 sp_rena ...
- Mybatis中动态SQL语句中的parameterType不同数据类型的用法
Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型, 此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...
- SQL语句中count(1)count(*)count(字段)用法的区别
SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...
- SQL语句中count(1)count(*)count(字段)用法的区别(转)
SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...
- sql语句中3表删除和3表查询
好久没来咱们博客园了,主要近期在忙一些七七八八的杂事,包括打羽毛球比赛的准备和自己在学jqgrid的迷茫.先不扯这些没用的了,希望大家能记得小弟,小弟在此谢过大家了. 回归正题:(以下的sql是本人在 ...
随机推荐
- oracle命令登录数据库
sqlplus aa/aa@jdbc:oracle:thin:@10.200.130.111:1521:nbact 或者 sqlplus aa/aa@nbact
- linux 一行一行的读取文件
#!/bin/bash #reading data from a file count= cat test1 | while read line do echo "Line $count: ...
- HugePage简介和KVM中使用HugePage
现在,有许多的处理器架构都支持多种的内存页大小,其中就包括比一般的page size大很多的huge page.就目前来说,尽管在个人电脑中基本都实现了对huge page的支持,然而,huge pa ...
- Linux 总结2
cd pwd mkdir ...
- php 按条件进行计算的方法
$isin = in_array($sheng,$s_sheng);//post过来的省的编码是否在s_sheng(自定义的数组)里,如果在,则加一,如果不在则不加一 if($isin){ //ech ...
- Handler classes should be static or leaks might occur
http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur ...
- 【BZOJ2793】[Poi2012]Vouchers 调和级数
[BZOJ2793][Poi2012]Vouchers Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整 ...
- 1052 最大M子段和(DP)
1052 最大M子段和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个 ...
- Spec Explorer 工具学习
基础概念:http://blogs.msdn.com/b/sechina/archive/2009/12/28/test.aspx 在线教程:http://blogs.msdn.com/b/sechi ...
- 巨蟒django之权限10,内容梳理&&权限组件应用
1.CRM项目内容梳理: 2.权限分配 3.权限组件的应用