根据身份证统计男女人数

今天的这个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无法实现,所以外面在包来一层。

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

转载于:https://my.oschina.net/zhaoqun/blog/687427

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值