本文中介绍的SQL中行列转换和嵌套式侧栏的生成,将SQL语句查询的结果转换成我们想要的结果。

  • 行转列,制作交叉表头
  • 列转行

实现行列转换(行—>列):制作交叉表

需求

根据下面的表Courses制作员工和课程的交叉表


生成如下的交叉表:


方法-外连接实现

-- 水平展开求交叉表,使用外连接

select C0.name,        case when C1.name is not null then 'o' else null end as "SQL入门",   -- 如果某位员工学习过某课程,则课程的相应列则出现他的名字,否则为NULL       case when C2.name is not null then 'o' else null end as "UNIX基础",     case when C3.name is not null then 'o' else null end as "java中级"from (select distinct name from Courses) C0  -- C0是侧栏left outer join(select name from Courses where course='SQL入门') C1 on C0.name = C1.name  -- select子句中的查询结果标为C1left outer join(select name from Courses where course='UNIX基础') C2 on CO.name = C2.nameleft outer join(select name from Courses where course='java中级') C3 on CO.name = C3.name;

SQL中指定了名称的表和视图都是相当于是集合

C0-C3的各自内容如下:

  • C0包含了全部的员工
  • C1-C3每个课程学习者的集合
name(C0) name(C1-SQL) name(C2-UNIX) name(C3-java)
赤井 赤井 赤井 工藤
工藤 工藤 吉田
铃木 铃木
吉田 渡边
渡边

方法-标量子查询实现

-- 标量子查询实现select C0.name, (select 'o' from Courses C1    -- 满足条件返回 o   where course='SQL入门'   and C1.name = C0.name) "SQL入门",

  (select 'o' from Courses C2   where course='UNIX基础'   and C1.name = C0.name) "UNIX基础",

   (select 'o' from Courses C3   where course='java中级'   and C1.name = C0.name) "java中级"

from (select distinct name from Courses) C0;  -- C0是表侧栏

标量子查询非常方便,如果有需要可以直接添加即可。缺点是性能不太好,性能开销还是比较大的。

方法-嵌套case表达式

-- 嵌套使用case表达式

select name,  -- 将聚合函数的执行结果用于条件判断 : sum(case...) = 1   case when sum(case when course='SQL入门' then 1 else null end) = 1 then 'o' else null end as "SQL入门",   -- sum的求和等于1说明这个人有选修该课程即then 'o'  case when sum(case when course='UNIX基础' then 1 else null end) = 1 then 'o' else null end as "UNIX基础", case when sum(case when course='java中级' then 1 else null end) = 1 then 'o' else null end as "java中级"

from Coursesgroup by name;

列转成行

需求1

将这张表转成行格式的数据


union all实现

UNION ALL不会排除重复行的数据,所以即使吉田没有孩子,也会出现3行相关的数据

-- 列转成行:union all

select employee, child_1 as child from personal  -- 查找child_1union allselect employee, child_2 as child from personal  -- 查找child_2union allselect employee, child_3 as child from personal  -- 查找child_3

结果为:


需求2

按照下面的表格生成数据


-- 存储子女列表的视图(孩子主表)

create view Children(child) as select child_1 from Personnelunionselect child_2 from Personnelunionselect child_3 from Personnel;
-- 员工列表为主表进行外连接操作

select emp.employee, Children.childfrom Personnel empleft outer join Childrenon Children.child in (emp.child_1, emp.child_2, emp.child_3);   -- 外连接的条件通过in关键字来指定

嵌套式表侧栏

在生成统计表的工作中,经常会有制作表头和表侧栏的要求。

需求




根据上面的3张表,生成如下的统计表格:


外连接实现嵌套式表侧栏

-- 外连接实现嵌套式表侧栏

select master.age_class as age_class,        master.sex_cd as sex_cd,      data.pop_tohoku as pop_tohoku,        data.pop_kanto as sex_cdfrom (select age_class, sex_cd from TblAge cross join TblSex) master   -- 交叉联结生成2张主表的笛卡尔积left outer join(select age_class, sex_cd,                    sum(case when pref_name in ('青森', '秋田') then population else null end) as pop_tohoku,                    sum(case when pref_name in ('东京', '千叶') then population else null end) as pop_kanto                from TblPop                group by age_class, sex_cd)  data  -- 临时表

 on master.age_class = data.age_class and master.sex_cd = data.sex_cd;

乘法运算的连接

需求

商品管理表和商品销售历史管理表,通过商品为单位汇总出各自的销量



方法1

select  I.item_no,    SH.total_qtyfrom Items Ileft outer join (select item_no, sum(quantity) as total_qty   -- 2-通过外连接求解                 from SalesHistory                 group by item_no) SH   -- 1-先按照item_no分组求和 on I.item_no = SH.item_no;

方法2

select    I.item_no,    sum(SH.quantity) as total_qtyfrom Items Ileft outer join SalesHistory SHon I.item_no = SH.item_no   -- 一对多的连接group by I.item_no;

一对一或者一对多关系的两个集合,在进行联结操作后行数不会增加

外连接的3种类型

  • 左外连接(left)
  • 右外连接(right)
  • 全外连接(full)

全外连接指的是将两个表的数据全部连接起来,如果表中不存在,则用空



-- 使用全连接使用

select    coalesce(A.id, B.id) as id   -- coalesce()接收多个参数,返回的是第一个非NULL的参数   ,A.name as A_name ,B.name as B_namefrom Class_A Afull outer join Class_B Bon A.id = B.id;

-- 结果id      A_name     B_name1       田中        田中2       铃木        铃木3       伊集院4                   田园寺

-- 使用左右连接+union合并实现(如果数据库不支持全外连接)

select   A.id as id    ,A.name   ,B.namefrom Class_A Aleft outer join  Class_B Bon A.id = B.idunion select                B.id as id                ,A.name               ,B.name           from Class_A A            right outer join Class_B B            on A.id = B.id;

sql sum条件求和_SQL进阶7外连接(outer join)相关推荐

  1. 外连接OUTER JOIN(三十五)

    外连接OUTER JOIN 1   LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_i ...

  2. sql sum条件求和_Hive中使用over()实现累积求和和滑动求和

    上一篇咱们介绍了三个常用的排序函数row_number(),rank()和dense_rank().这三个函数需要配合开窗函数over()来实现排序功能.但over()的用法远不止于此,本文咱们来介绍 ...

  3. mysql 多条件求和_sql多条件求和-sql条件求和-sql求和且和满足条件

    sql 根据多条件求和 select 日期, sum(产品数) as 产品数, 姓名 from 表名 group by 日期, 姓名 order by 日期, 姓名 用SQL语句对数据库某字段进行求和 ...

  4. SQL Server中的自连接和全外连接

                                SQL Server中的自连接和全外连接 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  5. sql 条件求和_Excel VBA+SQL 多条件求和实例

    SQL语句中多条件求和的语句如下: SELECT 分类字段1, 分类字段2 , SUM(统计字段) as 产品总数 From [Sheet1$] GROUP BY 分类字段1, 分类字段2 使用实例说 ...

  6. mysql sum按条件求和_SQL 累计求和

    今天看到有群友在群里了这个问题,问题描述见下图.这种需求在做报表统计时经常会遇到,会的人觉得不难,没有接触过可能会被困住,所以我把它拿出来和大家分享. 图中已把问题描述清楚,再结合数据看就更清晰了.用 ...

  7. linq to sql 行转列_SQL进阶:SQL高级编程语法实例

    之前写过的文章: canhui87:Oracle数据统计必会语法知识​zhuanlan.zhihu.com 主要是告诉大家学习SQL高级编程的参考路径,现在把书里简单的实例代码整理出来,方便以后随时查 ...

  8. mysql外连接插座_深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接...

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  9. SQL连接的理解和使用(内连接:自然连接等值连接,外连接:左连接右连接全外连接)

    目录 一.连接的介绍 连接是什么? 连接分几种? 条件连接 等值连接 自然连接 二.连接的使用 内连接 INNER JOIN 内连接与等值连接区别 内连接与自然连接区别 外连接 OUTER JOIN ...

最新文章

  1. [转]SAP FI/CO 模块设置
  2. 工商银行打造在线诊断平台的探索与实践
  3. Git 初始化版本库
  4. 自定义控件之绘图篇(三):区域(Range)
  5. 心情舒畅,升级到u10.04了
  6. [Usaco2008 Mar]River Crossing渡河问题
  7. MySQL中锁的必要性_MySQL中的锁之一:锁的必要性及分类
  8. 最强Redis实战学习笔记,没有之一!
  9. 找到自己的优势,才能干活不累,事半功倍!
  10. 摘抄笔记 centos内核优化
  11. 推荐几个后台管理界面
  12. 科技新品 | 索尼全画幅电影摄影机FX6;数字健康管理专业品牌Zepp智能手表;彩色视频电子纸显示器取得重大突破...
  13. Hexo接入码云评论系统
  14. docker提交比赛记录
  15. Unity3D_最简单的开始界面_结束界面
  16. Web3.0 使用说明书
  17. 【长难句分析精讲】并列结构
  18. NLP从入门到实战(三)
  19. 【C++Primer笔记】第四章 表达式
  20. 国庆期间的景区舆情工作实施方案

热门文章

  1. 【IT职场生存手册】他山之石,可以攻玉【51CTO技术论坛】
  2. 通信行业还是一个靠人际的行业
  3. java中什么时候不能用泛型_java中泛型的正确使用姿势
  4. mysql windows编译_Windows平台下编译Mysql源码 | 学步园
  5. gridsearchcv参数_使用python进行模型参数调优
  6. 奇数页分节符什么意思_删除分节符问题
  7. 函数平移口诀_呆哥数学函数合集——函数的图形变换来啦【4】
  8. 判断某值是否属于枚举类中的值_编写高质量可维护的代码之优化逻辑判断
  9. m4a录音文件损坏修复_智慧输入再升级 搜狗输入法创新推出AI录音助手功能
  10. 今天下午2:00,RT-Thread与智能车竞赛概况