根据身份证统计男女人数
根据身份证统计男女人数
黑夜探路人 发表于2年前
根据身份证统计男女人数
  • 发表于 2年前
  • 阅读 228
  • 收藏 9
  • 点赞 0
  • 评论 2

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 用SQL根据身份证号码统计男女人数

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

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

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 4
博文 26
码字总数 25102
评论 (2)
贺蜜峰
自定义sql函数,就解决了
贺蜜峰
自定义sql函数,就解决了
×
黑夜探路人
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: