文档章节

根据身份证统计男女人数

黑夜探路人
 黑夜探路人
发布于 2016/06/05 20:12
字数 806
阅读 258
收藏 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
0
0
MySQL--6 分组

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

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

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

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

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

阮一峰
2017/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解OAuth2.0协议

1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。豪车一般配备两种钥匙:主钥匙和泊...

xtof
3分钟前
0
0
Linux学习-0920

3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令 一、usermode命令 usermode作用是用来修改用户信息。 方法: usermod 参数 username 示例1:修改用户uid usermod -u 1010 test5 示例2...

wxy丶
13分钟前
0
0
synchronized锁对象的坑

今天本来写点其他东西,碰巧写了一下synchronized,没想到掉坑里面了,大佬别笑。 起初代码大概是这样的: package com.ripplechan.part_1_2_3;import java.util.concurrent.CountDownL...

RippleChan
16分钟前
0
0
XAMPP环境搭建(Apache + MariaDB + PHP + Perl)

operation system:ubuntu-18.04.1 step1:download XAMPP #sudo wget https://www.apachefriends.org/xampp-files/7.2.9/xampp-linux-x64-7.2.9-0-installer.run step2:install XAMPP #sudo ......

硅谷课堂
18分钟前
0
0
关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用

目的是为OSG做自定义的导出插件. 记录取得数据的方法. Max在代码中会提供一个INode对象. 从这个对象里取出各种数据. getSkin这个函数取出了ISkin修改器 下面这个函数一样是用于学习, 把数据输...

洛克人杰洛
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部