sql复杂案例
工作中往往会遇到非常棘手的数据查询,运营人员不知道你的数据库表是如何设计的,也不知道你的数据库记录了啥数据,他只知道自己需要看什么数据,甚至有些数据根本就不存在.
单表查询的难度: 一张数据库的表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复杂案例的更多相关文章
- SQL注入(SQL Injection)案例和防御方案
sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- mysql的sql优化案例
前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...
- SQL 优化案例 1
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- Hive SQL综合案例
一 Hive SQL练习之影评案例 案例说明 现有如此三份数据:1.users.dat 数据格式为: 2::M::56::16::70072, 共有6040条数据对应字段为:UserID BigInt ...
- SQL夯实基础(四):子查询及sql优化案例
首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from (2) on (3) join (4) where (5)group by (6) avg,sum... (7 ...
- SQL 优化案例
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- Spark SQL入门案例之人力资源系统数据处理
通过该案例,给出一个比较完整的.复杂的数据处理案例,同时给出案例的详细解析. 人力资源系统的管理内容组织结构图 1) 人力资源系统的数据库与表的构建. 2) 人力资源系统的数据的加载. 3) 人力资源 ...
- 数栈SQL优化案例:隐式转换
MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...
- Ibatis根据id获取拼接好的sql语句案例
//得到sql语句: public virtual string GetSqlStatement(string statementName, object paramObject) { ISqlMap ...
随机推荐
- HBase事务
众所周知,ACID是指原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability). HBase对同一行数据的操作提供ACID保证.HB ...
- 面试之路(6)-BAT面试之操作系统内存详解
本文主要参考两篇博客,读后整理出来,以供大家阅读,链接如下: http://blog.jobbole.com/95499/?hmsr=toutiao.io&utm_medium=toutiao ...
- Django处理流程
用户通过浏览器发送请求 请求到达request中间件,中间件对request请求做预处理或者直接返回response 若未返回response,会到达urlconf路由,找到对应视图函数 视图函数做相 ...
- combination sum、permutation、subset(组合和、全排列、子集)
combination sum I.permutation I.subsets I 是组合和.全排列.子集的第一种情况,给定数组中没有重复的元素. combination sum II.permut ...
- struts2线程安全
struts2线程安全 2012-02-16 21:07:58 分类: 系统运维 问题:Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题.Spring的Ioc容器管理 ...
- MDF,了解一下
1.MDF定义 MDF,全称(Measurement Data Format),即测量数据格式,是ASAM(自动化及测量系统标准协会)定义的.MDF的网页https://www.asam.net/st ...
- Django的时区问题
在Django项目中,最好全部日期值都做成配时区信息的,但是由于遗留项目或者跨语言项目,其他语言的开发人员觉得时区信息处理太麻烦.如何在一个项目中同时适配带时区和不带时区的两种字段. 1.输出:不带时 ...
- Scala编程入门---面向对象编程之对象
对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...
- 面试(三)---volatile
一.前言 最近去成都玩了一圈,整体感觉还不错,辞职以后工作找的也很顺利,随着年龄增加自己也考虑定居和个人长期发展的问题,反正乱七八糟的事,总之需要好好屡屡思路,不能那么着急下定论,当然我对 ...
- 搭建centos7的开发环境2-单机版Hadoop2.7.3配置
最近公司准备升级spark环境,主要原因是生产环境的spark和hadoop版本都比较低,但是具体升级到何种版本还不确定,需要做进一步的测试分析.这个任务对于大数据开发环境配置有要求,这里记录一下配置 ...