文档章节

根据身份证统计男女人数

黑夜探路人
 黑夜探路人
发布于 2016/06/05 20:12
字数 806
阅读 277
收藏 9

今天的这个SQL花了我大概四十多分钟,由于需求比之前的要复杂点,所以多花了点时间,下面就来分享下我的处理思路和完整的SQL代码吧。

之前处理逻辑问题的时候,一般都喜欢将其放到程序中处理,一是比较熟悉程序中的各种语法和方法,处理起来可能会得心应手,二是习惯了只用SQL来处理CURD操作,并且对SQL的了解不是很深入,导致很多的人都避免用SQL处理。

其实这种想法是错误的,我之前也是有这种想法,后来发现SQL有他自己独特的魅力,并且,很多的情况下,用SQL直接的执行效率要高于在程序中执行,当然,这个要分情况来定了,但我鼓励大家多尝试一些新的东西,学习一些新的语言,这样才能快速成长,不是吗

废话不多说,下面上干货。

这个的需求是通过民警身份证号来获取其性别,并进行统计,难点在于其中有的身份证号码是18位的,有的是15位的,这个就需要分情况来判断,当然,如果在程序中处理是很好处理的,现在提升的难度是想只用一天SQL来实现其中的判断和统计操作。

个人处理思路是用PGSQL中的case语句来执行判断操作,然后通过数据的截取函数substring来截取我们需要的那个数,通过该数模2来判断到底是奇数还是偶数,奇数表示男,反之则表示女,最后是通过聚集函数来统计男女人数。

下面直接上SQL语句

SELECT SUM(female) female,SUM(male) male FROM (
SELECT CASE WHEN (char_length(t2.idcard)=18 AND (CAST(substring(t2.idcard,char_length(t2.idcard)-1,1) AS INTEGER)%2 = 0))
 OR (char_length(t2.idcard)=15 AND (CAST(substring(t2.idcard,char_length(t2.idcard),1) AS INTEGER)%2 = 0))
 THEN 1 ELSE 0 END female,
CASE WHEN (char_length(t2.idcard)=18 AND (CAST(substring(t2.idcard,char_length(t2.idcard)-1,1) AS INTEGER)%2 != 0))
 OR (char_length(t2.idcard)=15 AND (CAST(substring(t2.idcard,char_length(t2.idcard),1) AS INTEGER)%2 != 0))
 THEN 1 ELSE 0 END male
FROM (SELECT DISTINCT mjbh FROM policehealth_hospitalized) t1 LEFT JOIN users t2 ON t1.mjbh=t2.policenum WHERE (char_length(t2.idcard)=18 OR char_length(t2.idcard)=15))tt

这里可能在看的时候有点困难,下面解释下其中几个函数的用法

char_length()是来获取字段数据中的长度的,

substring()是用来进行截取的,其有三个参数,一位需要截取的字段名,二位截取的起始位置,三是需要截取的长度,

cast()是一个用户自己定义的转换类型的函数,这里是将string类型转换成来integer类型

case when then else end就是SQL中的逻辑判断了

这里用到了子查询是因为里面的条件判断有两个,直接在里面用sum无法实现,所以外面在包来一层。

如果觉得对你有帮助,记得关注我,也希望大家能多交流

© 著作权归作者所有

共有 人打赏支持
黑夜探路人
粉丝 5
博文 26
码字总数 25102
作品 0
贵阳
程序员
私信 提问
加载中

评论(2)

贺蜜峰
贺蜜峰
自定义sql函数,就解决了
贺蜜峰
贺蜜峰
自定义sql函数,就解决了
氚云人事文档介绍

HR管理痛点: 伴随着企业的逐步发展和壮大,集团形态将是最重要的企业运作模式,与此相伴,组织规模将会越来越大,组织层次越来越复杂,管理幅度也会越来越多。 同时,人力资源管理也是一门专...

lwl_BPM
2017/06/20
0
0
求大佬帮写用JAVA数据结构写一个简易族谱

二、课程设计项目及要求 1、项目名称:族谱管理系统的设计与实现 2、目的要求:采用树型结构实现族谱的创建、查询、插入等相关操作。课程设计目的是理解树型结构的设计思想,通过课程设计,一...

某先生
07/12
614
6
MySQL--6 分组

#分组 按照字段分组,表示此字段相同的数据会被放到一个组中 分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中 可以对分组后的数据进行统计,做聚合运算 语法: sele...

pp小白
01/24
0
0
2018 春运即将启幕,AI 上线保障旅客安全

2018年春运即将上线。 提起春运,很多人心中五味杂陈,“拥挤”、“抢票难”、“偷盗频发”等字眼跃然脑中。 其实这些年,随着铁路部门加大对智能化和服务创新的投入,上述几个热词在2018年开...

张栋
01/08
0
0
正态分布为什么常见?

统计学里面,正态分布(normal distribution)最常见。男女身高、寿命、血压、考试成绩、测量误差等等,都属于正态分布。 以前,我认为中间状态是事物的常态,过高和过低都属于少数,这导致了...

阮一峰
2017/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

esxi 更换ssl证书

概述 就是想换一个证书而已,你可以通过下面的途径去申请一个泛解析域名的证书之后再esxi上安装上 使用阿里云域名api申请Let’s Encrypt泛域名免费ssl证书 申请完成证书之后进行下一步 操作 ...

bboysoulcn
4分钟前
0
0
PLC编程入门:梯形图

梯形图(LAD)是PLC编程的最佳可视化语言,它看起来非常类似于继电器电路图,因此如果 你对继电器控制和电子电路有所了解的话,那么学起来会非常容易! 在这个教程中,我们将学习关于使用梯形...

汇智网教程
7分钟前
0
0
Kubernetes 1.13.0的快速升级

Kubernetes 1.13.0已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.13.0版本暂时不支...

openthings
20分钟前
2
0
go的卸载和环境变量配个人.bashrc

若是用安装包直接解压 http://download.csdn.net/detail/u010026901/7592581 cd /usr/local tar -zxvf go1.1.2.linux-386.tar.gz(先把安装包移到这个目录) 3.安装 $ cd go/src,$ ./all.b......

dragon_tech
26分钟前
1
0
区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部