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 ,列转行查询的更多相关文章

  1. SQL语句之 多表管理

    SQL语句之 多表管理 一个数据库内通常会有不止一张表,有时候我们要把多张表联系起来,这就需要用到多表管理的语句. 1.外键约束 一个表中的非主键字段,如果在另外一张表中是主键,那么这个字段我们叫它做 ...

  2. 使用sql语句获取数据库表的信息

    下面的sql语句可以查看表的信息.其中modify_date和create_date可以根据表的修改时间来查看.如果不需要删除后,就能看到所有表的字段信息 ) PERCENT d.name AS 表名 ...

  3. sql语句中----删除表数据drop、truncate和delete的用法

    sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table  tb   --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...

  4. (转载)用SQL语句创建Access表

    <来源网址:http://www.delphifans.com/infoview/Article_220.html>用SQL语句创建Access表 很久以前弄的,用了一天的时间,没有什么技 ...

  5. ylb:sql语句重命名表名和列名

    ylbtech-SQL Server:SQL Server-sql语句重命名表名和列名 sql语句重命名表名和列名 ylb:sql语句重命名表名和列名 返回顶部 一.更改数据库名    sp_rena ...

  6. Mybatis中动态SQL语句中的parameterType不同数据类型的用法

    Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型,    此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...

  7. SQL语句中count(1)count(*)count(字段)用法的区别

    SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...

  8. SQL语句中count(1)count(*)count(字段)用法的区别(转)

    SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...

  9. sql语句中3表删除和3表查询

    好久没来咱们博客园了,主要近期在忙一些七七八八的杂事,包括打羽毛球比赛的准备和自己在学jqgrid的迷茫.先不扯这些没用的了,希望大家能记得小弟,小弟在此谢过大家了. 回归正题:(以下的sql是本人在 ...

随机推荐

  1. iOS masonry布局在iOS11/12上正常 iOS9/10却异常

    使用masonry布局,可以布局一套,适配所有机型,但是有时候会出现一些比较特殊的情况,每次iOS11上面开发,开发完成之后,在iOS9,iOS10上查看的时候发现布局与iOS11不完全一致,有的高度 ...

  2. 各类 HTTP 返回状态代码详解(转)

    FTP状态码 一.HTTP状态码 如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如,用户通过浏览器访问您的网页或 Googlebot 抓取网页时),服务器将会返回 HTTP 状态代码以响应 ...

  3. size_t ssize_t loff_t 的区别

    Ssize_t 与size_t 跟踪linux源码得到以下宏: #ifndef _SIZE_T #define _SIZE_T typedef __kernel_size_t         size ...

  4. github桌面工具commit不了解决

    这样发现github上还是空文件,  因为要重新添加过 1.  git add -A  添加所有文件 2. git commit -m "xxx" 3.  git push -u ...

  5. mediawiki常用设置

    修改mediawiki的logo图标 在LocalSettings.php文件中添加或修改以下代码: //$wgLogo             = "$wgStylePath/common ...

  6. plsql programming 09 数字

    number 类型, 十进制数据类型(平台无关的) pls_integer 和 binary_integer 这两种数据类型和你底层硬件表示整数的方法完全一致, 这两种类型的运算是利用硬件原生, 机器 ...

  7. Linux gdb调试器

    gdb的启动 --gdb 程序名 [corefile] --corefile是可选的,但能增强gdb的调试能力 --强调:启动gdb必须在编译命里加上"-g"参数,"-g ...

  8. Android 混淆完全解析

    1.http://blog.csdn.net/jddkdd2/article/details/8858909

  9. python升级后pip 不可用 卸载pip

    python版本由2.6升级到2.7之后,用pip提示报错 找了一下原因,网上的版本很多.弄来弄去比较麻烦 来点简单粗暴的 1.卸载pip yum remove python-pip 2.下载 cur ...

  10. linux oracle sqlplus中文乱码解决

    在oracle用户的~/.bash_profile中添加 NLS_LANG="SIMPLIFIED CHINESE"_CHINA.ZHS16GBKexport NLS_LANG 然 ...