SQL Server中按orderID实现饮品类型标签标记的SQL查询
订单饮品类型标记的SQL查询方案
每个订单可能包含热饮、冷饮或同时包含两者,现有订单数据表如下:
| orderID | ProductID | 类型 |
|---|---|---|
| am2 | 212 | 冷饮 |
| am2 | 51004 | 热饮 |
| am2 | 10032 | 热饮 |
需求说明
若订单同时包含热饮和冷饮两种类型,则标记为“both”;否则按饮品原有类型标记,期望得到结果如下:
| orderID | label |
|---|---|
| am2 | both |
解决方案
这里提供两种常见的SQL实现方式:
方法一:分组统计类型数量
通过分组后统计订单内的不同类型数量来判断,代码如下:
SELECT orderID, CASE WHEN COUNT(DISTINCT 类型) = 2 THEN 'both' ELSE MAX(类型) END AS label FROM 订单表 GROUP BY orderID;
逻辑说明:
- 按
orderID分组,COUNT(DISTINCT 类型)会统计当前订单下的不同饮品类型数量 - 若数量为2,说明同时存在热饮和冷饮,标记为
both - 若数量为1,说明只有一种类型,用
MAX(类型)(或MIN(类型))取出该类型作为标记
方法二:使用EXISTS子查询验证
通过子查询分别验证订单是否包含两种类型,代码如下:
SELECT DISTINCT o.orderID, CASE WHEN EXISTS (SELECT 1 FROM 订单表 o2 WHERE o2.orderID = o.orderID AND o2.类型 = '热饮') AND EXISTS (SELECT 1 FROM 订单表 o2 WHERE o2.orderID = o.orderID AND o2.类型 = '冷饮') THEN 'both' ELSE o.类型 END AS label FROM 订单表 o;
逻辑说明:
- 用
EXISTS分别检查当前订单是否存在热饮和冷饮的记录 - 若两个条件同时满足,标记为
both - 否则直接取当前订单的饮品类型,
DISTINCT确保每个订单只返回一条结果
内容的提问来源于stack exchange,提问作者WhoIsKi
相关产品推荐
相关产品推荐

