工作中往往会遇到非常棘手的数据查询,运营人员不知道你的数据库表是如何设计的,也不知道你的数据库记录了啥数据,他只知道自己需要看什么数据,甚至有些数据根本就不存在.

  单表查询的难度: 一张数据库的表table,如下图,一个房间两个人对局,房主houser 挑战者challenger,只记录了赢家winner,以及分数point

  需求,列出  玩家,今天输的总分数,今天赢的总分数,最终输赢的分数最终的查询的结果是

  暂时不吐槽表的设计者,以及提出需求的运营人员. 要把这个数据查出来,得用很多sql技巧,不限于 case when ,left join ,right join,union

  来看一个最简单的查询语句:

  select /*something*/ from table  #从表中查询某字段

  根据需求我们可以得出初步sql:

  select player,totallose,totalwin,(totallose+totalwin) from table  #查询玩家输的总数,赢得总数,最终分数,

  显然从table不能直接找到需求的字段,而是要经过一定的逻辑处理和运算

  select player,totallose,totalwin,(totallose+totalwin) from (/*something*/)

  括号里面的(/***/)就是我们需要对数据进行一些逻辑处理

  第一步:查询输的,把输的人查出来,以及输的总数

  (select case when winner=houser then challenger when winner=challenger then houser else 0 end AS player,

  sum(-point) AS lose from table group by player ) AS a

  第二步,左联一下,把原本输的人的赢得总数查出来

  LEFT JOIN (SELECT winner AS player ,sum(point) AS win group by player) AS b

  ON a.player=b.player

  第三步,把赢的人,和赢的总数查出来,即把刚才的左联变成右连

  (select case when winner=houser then challenger when winner=challenger then houser else 0 end AS player, sum(-point) AS lose from table group by player ) AS a

  RIGHT JOIN (SELECT winner AS player ,sum(point) AS win group by player) AS b

  ON a.player=b.player

  第四步 把左联和右连的结果再union一下

  回到 我们一开始的最简单的那条查询

  select player,totallose,totalwin,(totallose+totalwin) from (/***/)

  最终,我们要把 (/***/) 完成, 把第一二步查出来的结果作为数据从中查出玩家,再union一下右连接

SELECT

  a.player AS player , a.lose AS totallose, b.win AS totalwin, (totallose+totalwin) AS total

FROM

  ( SELECT

    case when winner=houser then challenger when  winner=challenger then houser else 0 end AS player, sum(-point)     AS   lose

   FROM

    table

  GROUP BY player

  )  AS a

LEFT JION

  (SELECT

    winner AS player , sum(point) AS win

  FROM

    table

  GROUP BY

    player) AS b

ON

  a.player=b.player

UNION

SELECT

  a.player AS player , a.lose AS totallose, b.win AS totalwin, (totallose+totalwin) AS total

FROM

  ( SELECT

    case when winner=houser then challenger when winner=challenger then houser else 0 end  AS player, sum(-point)     AS   lose

   FROM

    table

  GROUP BY player

  )  AS a

RIGHT JION

  (SELECT

    winner AS player ,sum(point) AS win

  FROM

    table

  GROUP BY

    player) AS b

ON

  a.player=b.player

ORDER BY total DESC

本文完......

地址:https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554680&idx=1&sn=4ba6ac9e6e41c17329d5944e5aaaa60d&chksm=f3f833aec48fbab8895402ba2f859064a8c71bda062769a47167360b60bdd21dea6edc8579a1#rd

sql复杂案例的更多相关文章

  1. SQL注入(SQL Injection)案例和防御方案

    sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...

  2. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

  3. mysql的sql优化案例

    前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...

  4. SQL 优化案例 1

    create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...

  5. Hive SQL综合案例

    一 Hive SQL练习之影评案例 案例说明 现有如此三份数据:1.users.dat 数据格式为: 2::M::56::16::70072, 共有6040条数据对应字段为:UserID BigInt ...

  6. SQL夯实基础(四):子查询及sql优化案例

    首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from  (2) on   (3) join  (4) where  (5)group by  (6) avg,sum...  (7 ...

  7. SQL 优化案例

    create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...

  8. Spark SQL入门案例之人力资源系统数据处理

    通过该案例,给出一个比较完整的.复杂的数据处理案例,同时给出案例的详细解析. 人力资源系统的管理内容组织结构图 1) 人力资源系统的数据库与表的构建. 2) 人力资源系统的数据的加载. 3) 人力资源 ...

  9. 数栈SQL优化案例:隐式转换

    MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...

  10. Ibatis根据id获取拼接好的sql语句案例

    //得到sql语句: public virtual string GetSqlStatement(string statementName, object paramObject) { ISqlMap ...

随机推荐

  1. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  2. Solr 新增、更新、删除索引

    solr-admin新增索引 [索引中无则新增,有则更新] 1.在doc标签和field标签中增加权重(boost),增加权重后,可以在搜索的时候做权重过滤. <add> <doc ...

  3. 什么是shell? bash和shell有什么关系?

    什么是shell? bash和shell有什么关系? 博客分类: Linux   什么是Shell?      shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序 ...

  4. INCA二次开发-MIP

    1.INCA介绍 INCA是常用的汽车ECU测试和标定的,广泛应用于动力总成等领域.INCA提供了丰富的接口,供用户自动化.定制化.本公众号通过几篇文章,介绍下一些二次开发的方法,本篇介绍MIP. 2 ...

  5. VS2017安装包不占用C盘空间的方法,亲试

    问题:普通VS2017的安装方式,不论是在线安装还是下载的离线安装包,都会在安装过程中将安装包保存在C:\ProgramData\Microsoft\VisualStudio\Packages文件夹下 ...

  6. Win7下 Python中文正则的奇异表现

    首先贴Win32下的直接Python shell下的测试结果: Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (In ...

  7. 晒stlink以及stm8“开发板”

    先上图:( ̄▽ ̄)" 单层板+几根飞线,之前做jlink-ob做过孔整怕了,画pcb的时候尽量朝单层画的 外壳用sw建模,并3d打印 引出了swim for stm8单总线调试接口 以及sw ...

  8. linux/unix解压缩

    转自:http://blog.sina.com.cn/s/blog_6f2d29af01015ac6.html zip: 压缩: zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][ ...

  9. jQuery匿名函数$(function(){ }

    搬运原地址:https://zhidao.baidu.com/question/473318430.html $(function(){ }实际上是匿名函数.这是JQuery的语法,$表示JQuery ...

  10. 4sumii

    problem description: there is four number list named A,B,C,D; now you should out put the num of  tup ...