家里智能设备越来越多,路由器、手机、平板、智能电视、摄像头,连冰箱都联网了。有时候想看看每个设备用了多少流量,但数据库里数据是按时间一条条记录的,看起来挺乱。这时候,用SQL的行转列功能就能让数据变得清晰直观。
什么是行转列?
简单说,就是把原本竖着排的数据“掰”成横着排。比如数据库里有三行数据,分别是手机、平板、电脑的今日流量,行转列后,这三个设备的名字就变成三个字段,一行展示完。
实际场景:统计设备日流量
假设我们有个表 device_traffic,结构如下:
device_name traffic_date used_gb
手机 2024-04-01 2.1
平板 2024-04-01 1.3
电脑 2024-04-01 3.5
我们希望输出一行结果,像这样:
手机流量 平板流量 电脑流量
2.1 1.3 3.5
使用CASE WHEN + 聚合实现行转列
在MySQL或SQLite这类不直接支持PIVOT的数据库中,可以用这个方法:
SELECT
SUM(CASE WHEN device_name = '手机' THEN used_gb ELSE 0 END) AS 手机流量,
SUM(CASE WHEN device_name = '平板' THEN used_gb ELSE 0 END) AS 平板流量,
SUM(CASE WHEN device_name = '电脑' THEN used_gb ELSE 0 END) AS 电脑流量
FROM device_traffic
WHERE traffic_date = '2024-04-01';
这里用 SUM 是因为要确保只返回一行。如果某设备当天没数据,会显示0,不会出错。
多天数据也想分开看?加个分组就行
要是数据有好几天,想每天一行地展示,只需要加上 GROUP BY traffic_date,每条日期都会自动转成横向排列。
小贴士:别忘了处理未知设备
家里新买了智能音箱,但SQL里没写它的名字,那它的流量就不会被统计进去。建议定期检查设备列表,或者用程序动态生成这类查询,避免遗漏。
行转列不是什么高深技术,但在整理家庭网络使用情况时特别实用。几行SQL就能把杂乱的日志变成一张清爽的日报,谁用谁知道。