CASE...WHEN...和SUM()函数

本文介绍了一种使用SQL语句按身份证号前几位确定旅客所属地区的方法,通过SUM和CASE WHEN函数统计各地区人数,为制作饼状图提供数据支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照身份证号前几位确定属于什么地区,得出发送旅客人员组成每个地区人数,以便做成饼状图


SELECT
SUM(CASE WHEN SUBSTR(DW_CTKY_GFDPXX.ZJHM,1,4) = ‘3716’ THEN 1 ELSE 0 END)AS 滨州人,
SUM(CASE WHEN SUBSTR(DW_CTKY_GFDPXX.ZJHM,1,4) != ‘3716’ AND SUBSTR(DW_CTKY_GFDPXX.ZJHM,1,2) = ‘37’ THEN 1 ELSE 0 END)AS 滨州以外的山东人,
SUM(CASE WHEN SUBSTR(DW_CTKY_GFDPXX.ZJHM,1,2) = ‘37’ THEN 1 ELSE 0 END)AS 山东人,
SUM(CASE WHEN SUBSTR(DW_CTKY_GFDPXX.ZJHM,1,2) !=’37’ THEN 1 ELSE 0 END)AS 省外人员
FROM QBHCHL.DW_CTKY_GFDPXX
一开始想用count()对数据进行统计,结果mysql一直报错,后来查阅资料得知case when不与count连用,不过使用sum()是可以的,而且mysql中截取字符串前几位可以使用SUBSTRING()或者LEFT()之类的,但是ORACLE中是没有LEFT()函数的,截取的函数名为SUBSTR(),在名字上也区别于SUBSTRING()

### MySQL 中 `SUM` 函数与 `CASE WHEN` 结合使用的详解 #### 使用场景描述 在处理复杂查询需求时,经常需要根据不同条件计算特定数据的汇总值。通过将 `SUM()` `CASE WHEN ... THEN ... ELSE ... END` 联合起来可以实现基于不同逻辑分支的数据聚合操作。 #### SQL语法结构展示 对于给定表中的记录可以根据某些属性来决定哪些应该被计入最终的结果集中: ```sql SELECT SUM( CASE WHEN condition_expression_1 THEN value_to_sum_for_true_case_1 WHEN condition_expression_2 THEN value_to_sum_for_true_case_2 ... ELSE default_value_or_zero END ) AS calculated_column_name, FROM table_name; ``` 这里的关键在于利用 `CASE WHEN` 来定义多个可能的情况及其对应的数值表达式,在遇到符合条件的情况下返回相应的值用于后续求运算;如果都不匹配则采用默认情况下的设定[^1]。 #### 实际案例分析 考虑如下例子:假设有一个订单表格 `y_quote_order` 包含客户类型 (`client_type`) 及状态(`status`) 字段。现在想要分别统计两种不同类型客户的有效订单数量(即状态为已确认的状态码),可以通过下面这条语句完成此任务: ```sql SELECT SUM(CASE WHEN qo.client_type = 1 AND qo.status = 10 THEN 1 ELSE 0 END) AS typeOneCount, SUM(CASE WHEN qo.client_type = 2 AND qo.status = 10 THEN 1 ELSE 0 END) AS typeTwoCount FROM y_quote_order qo; ``` 上述命令会针对每种类型的客户端生成单独的一列计数结果,并且只会在指定条件下增加计数器。 另外一种情形是在高度等于特定值的时候赋予固定分值并做总计,比如从身高表`t_wzw`里筛选出所有身高恰好是175cm的人给予4分奖励,其余一律记作3分,最后算出总得分: ```sql SELECT SUM(CASE WHEN t_wzw.height = 175 THEN 4 ELSE 3 END) as total_score FROM t_wzw; ``` 这段代码实现了当某条记录满足特定条件时为其分配不同的权重因子再进行累积相加的操作[^2]。 综上所述,这种组合方式提供了极大的灵活性使得开发者能够轻松应对各种复杂的业务逻辑要求而无需依赖额外的应用层编程工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值