You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在1:N关联的Order与OrderDetail表中用CASE语句分类订单

订单类别统一/混合的查询实现方法

核心思路

要实现这个需求,关键是先统计每个订单对应的所有明细中不同类别的数量,再根据数量判断是显示单一类别还是"Mixed"。具体分两步:

  1. 对OrderDetail表按订单ID分组,统计每个订单的类别数量,同时取出该订单的一个类别值(如果类别唯一,这个值就是唯一的类别)。
  2. 将统计结果和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:50:00