sql
select pay_ability,
concat(
round(
sum(case when l.overdue_days is not NULL then 1 else 0 end )/count(*)*100,
1
),
'%'
) as overdue_ratio
from customer_tb as c
join loan_tb as l
on c.customer_id = l.customer_id
group by c.pay_ability
order by overdue_ratio desc
sql
select
date_format(t.t_time,'%Y-%m') as time,
round(sum(t.t_amount),1) as total
from trade t
join customer c
on t.t_cus = c.c_id
where
c.c_name = 'Tom'
and t.t_type=1
and year(t.t_time)=2023
group by time
order by time
1、聚合与计算sum()
- 功能 :对指定字段的数值求和,属于聚合函数(常用于
GROUP BY
分组后计算每组的总和)。 - 两段 SQL 中的应用 :
- 第一段:
sum(case when l.overdue_days is not NULL then 1 else 0 end)
对 "逾期标记(1/0)" 求和,得到逾期记录总数。 - 第二段:
sum(t.t_amount)
对交易金额求和,得到每组(每月)的总金额。
- 第一段:
- 使用要点 :聚合函数需与
GROUP BY
配合(或作用于全表),计算的是 "组内总和"。
2、条件判断case when
- 功能 :实现条件判断(类似编程语言中的
if-else
),根据条件返回不同值,可用于行级别的逻辑处理。 - SQL 中的应用:
sql
case when l.overdue_days is not NULL then 1 else 0 end
表示 "若逾期天数不为空(即逾期),则标记为 1;否则标记为 0"。
使用要点:
- 语法为
CASE WHEN 条件1 THEN 结果1 ELSE 结果2 END
,可嵌套多个WHEN
。 - 常与聚合函数配合(如
SUM
/COUNT
),实现 "按条件统计"。
3、round()
- 功能:对数值进行四舍五入,指定保留的小数位数。
- 两段 SQL 中的应用 :
- 第一段:
round(..., 1)
对逾期率百分比保留 1 位小数(如35.23%
→35.2%
)。 - 第二段:
round(sum(t.t_amount),1)
对总金额保留 1 位小数(如1250.67
→1250.7
)。
- 第一段:
- 使用要点 :语法为
ROUND(数值, 小数位数)
,若小数位数为 0,则返回整数。
4、concat()
功能:将多个字符串(或可转换为字符串的数值)拼接为一个字符串。
第一段 SQL 中的应用:
java
concat(round(...), '%')
将四舍五入后的逾期率数值与 "%" 拼接(如35.2
→35.2%
)。
使用要点 :参数可以是字段、常量或计算结果,若其中一个参数为NULL
,则整体返回NULL
(需注意处理NULL
)。
5、year()
- 功能 :提取日期 / 时间字段中的年份(返回 4 位数字,如
2023
),属于日期处理函数。 - 第二段 SQL 中的应用 :
year(t.t_time)=2023
表示筛选出交易时间在 2023 年的记录。 - 使用要点 :类似的函数还有
MONTH()
(提取月份)、DAY()
(提取日),常用于按时间维度筛选数据。
6、date_format()
- 功能 :将日期 / 时间字段(
DATE
/DATETIME
等)转换为指定格式的字符串,用于自定义日期展示。 - 第二段 SQL 中的应用 :
date_format(t.t_time,'%Y-%m') as time
将交易时间格式化为 "年 - 月" 字符串(如2023-05
)。 - 使用要点 :
- 格式符区分大小写:
%Y
(4 位年)、%y
(2 位年)、%m
(2 位数字月)、%M
(英文月全称)。 - 格式化后的结果为字符串,若需按时间排序,建议基于原始日期字段逻辑(但本例中
%Y-%m
字符串排序与时间顺序一致,可直接用)。
- 格式符区分大小写:
为了更清晰,我们把四种常见的 "年 - 月" 组合放在一起对比:
格式化表达式 | 年份格式 | 月份格式 | 示例输出(2023-05-15) | 适用场景 |
---|---|---|---|---|
%Y-%m |
4 位(2023) | 2 位数字(05) | 2023-05 |
报表统计、时间排序(最常用) |
%Y-%M |
4 位(2023) | 英文全称(May) | 2023-May |
英文场景的可读性展示 |
%y-%m |
2 位(23) | 2 位数字(05) | 23-05 |
简化年份的场景(如内部短报表) |
%y-%M |
2 位(23) | 英文全称(May) | 23-May |
简化年份的英文展示 |