如何在1:N关联的Order与OrderDetail表中用CASE语句分类订单
订单类别统一/混合的查询实现方法
核心思路
要实现这个需求,关键是先统计每个订单对应的所有明细中不同类别的数量,再根据数量判断是显示单一类别还是"Mixed"。具体分两步:
- 对
OrderDetail表按订单ID分组,统计每个订单的类别数量,同时取出该订单的一个类别值(如果类别唯一,这个值就是唯一的类别)。 - 将统计结果和
Order表关联,用CASE语句根据类别数量生成目标列。
具体SQL代码
基础子查询写法(适合SQL基础学习者)
SELECT o.*, CASE WHEN od_stats.category_count = 1 THEN od_stats.category_name ELSE 'Mixed' END AS order_category_summary FROM `Order` o -- 注意:Order是SQL关键字,不同数据库转义方式不同:MySQL用反引号,SQL Server用[Order],Oracle用"Order" JOIN ( -- 子查询:统计每个订单的类别数量和单一类别名称 SELECT OrderId, COUNT(DISTINCT Category) AS category_count, MIN(Category) AS category_name -- 类别唯一时,MIN/MAX结果一致,任选其一即可 FROM OrderDetail GROUP BY OrderId ) od_stats ON o.OrderId = od_stats.OrderId;
补充说明
- 如果存在没有明细的空订单,可以把
JOIN改成LEFT JOIN,并在CASE中补充判断:CASE WHEN od_stats.category_count IS NULL THEN 'No Items' WHEN od_stats.category_count = 1 THEN od_stats.category_name ELSE 'Mixed' END AS order_category_summary COUNT(DISTINCT Category)是统计不同类别的核心函数,几乎所有主流数据库(MySQL、SQL Server、Oracle等)都支持。
内容的提问来源于stack exchange,提问作者KJ009250
相关产品推荐
相关产品推荐

