HQL CASE WHEN 电商+农业大数据实战案例分享
作为新疆和田的大数据技术专业学生,虽然暂时没找到对口工作,但一直没停下专业积累——不管是电商数据处理,还是家乡的农业大数据应用,都发现HQL的CASE WHEN语句是高频实用工具。它就像“数据分类转换器”,能轻松搞定跨行业的分类、转码、统计需求。今天整理电商+农业双场景的实战案例,和深耕技术的小伙伴一起学习探讨~感谢阅读咱继续往前
一、电商场景(核心需求+极简实现)
1. 订单状态转义
需求:编码0-4转文字描述(适配报表展示)
sql
SELECT
order_id, user_id,
CASE order_status
WHEN 0 THEN '待付款' WHEN 1 THEN '已付款' WHEN 2 THEN '已发货'
WHEN 3 THEN '已完成' WHEN 4 THEN '已取消' ELSE '未知状态'
END AS order_status_desc,
pay_amount, shop_id
FROM dw.order_info;
2. 用户消费分级
需求:按30天消费额划分用户等级(支撑精准营销)
sql
SELECT
user_id, user_name, total_pay,
CASE
WHEN total_pay >=2000 THEN '高价值用户'
WHEN total_pay >=1000 THEN '活跃用户'
WHEN total_pay >=300 THEN '潜力用户'
ELSE '新用户'
END AS user_level
FROM dw.user_consume;
3. 店铺订单统计
需求:按店铺统计各状态订单数(运营决策用)
sql
SELECT
shop_id,
SUM(CASE WHEN order_status=0 THEN 1 ELSE 0 END) AS pending_pay_cnt,
SUM(CASE WHEN order_status=1 THEN 1 ELSE 0 END) AS paid_cnt,
SUM(CASE WHEN order_status=2 THEN 1 ELSE 0 END) AS shipped_cnt,
COUNT(*) AS total_order_cnt
FROM dw.order_info GROUP BY shop_id;
4. 区域化筛选
需求:新疆高价值用户已完成订单+非新疆活跃用户已付款订单
sql
SELECT order_id, user_id, user_level, province
FROM dw.order_info
LEFT JOIN dw.user_consume ON order_info.user_id=user_consume.user_id
LEFT JOIN dw.user_addr ON order_info.user_id=user_addr.user_id
WHERE
CASE
WHEN province='新疆' THEN user_level='高价值用户' AND order_status=3
ELSE user_level='活跃用户' AND order_status=1
END;
二、农业大数据(新疆和田特色场景)
area_id area_name climate_type avg_yield
5001 和田县 暖温带干旱 3200kg/亩
5002 墨玉县 暖温带半干旱 2900kg/亩
5003 皮山县 温带干旱 2500kg/亩
5004 洛浦县 暖温带干旱 3500kg/亩
1. 作物成熟度转义
需求:编码0-3转文字(适配农业监测报表)
sql
SELECT
crop_id, crop_name,
CASE maturity_code
WHEN 0 THEN '未成熟' WHEN 1 THEN '半成熟' WHEN 2 THEN '成熟'
WHEN 3 THEN '完全成熟' ELSE '未知'
END AS maturity_desc,
area_id, yield_pred
FROM dw.crop_monitor;
2. 种植产区分级
需求:按平均产量划分产区等级(种植规划用)
sql
SELECT
area_id, area_name, avg_yield,
CASE
WHEN avg_yield >=3200 THEN '优质产区'
WHEN avg_yield >=2800 THEN '适宜产区'
ELSE '潜力产区'
END AS area_level
FROM dw.plant_area;
3. 作物产量统计
需求:按区域统计红枣、核桃、葡萄预计产量
sql
SELECT
area_id, area_name,
SUM(CASE WHEN crop_name='和田红枣' THEN yield_pred ELSE 0 END) AS jujube_yield,
SUM(CASE WHEN crop_name='薄皮核桃' THEN yield_pred ELSE 0 END) AS walnut_yield,
SUM(yield_pred) AS total_yield
FROM dw.crop_monitor
LEFT JOIN dw.plant_area ON crop_monitor.area_id=plant_area.area_id
GROUP BY area_id, area_name;
4. 优质作物筛选排序
需求:筛选优质产区完全成熟作物,按产量降序
sql
SELECT area_name, crop_name, yield_pred
FROM dw.crop_monitor JOIN dw.plant_area ON crop_monitor.area_id=plant_area.area_id
WHERE area_level='优质产区' AND maturity_code=3
ORDER BY yield_pred DESC;
三、核心注意点
1. 条件按“从大到小”写,避免逻辑重叠
2. 编码超10个用维表JOIN,别硬写CASE WHEN
3. 必加ELSE,防止NULL值影响统计结果
(不是因为有希望才坚持,而是坚持了才有希望。)
更多推荐
所有评论(0)