MS SQL分组查询需求:基于LOGGING STATUS对ID分类
没问题,我来帮你搞定这个MS SQL的分组分类需求~
首先得明确核心要求:每个ID最终只返回一行记录,根据该ID下所有LOGGING STATUS的整体情况统一输出状态值,同时保留对应的ZIP-CODE。下面分几种常见场景给你对应的SQL语句:
解决方案
1. 基础场景:每个ID的ZIP-CODE唯一,状态仅全失败/全成功
如果你的数据里同一个ID的ZIP-CODE都是一致的,且每个ID的LOGGING STATUS要么全是fail要么全是success,直接用聚合函数就能搞定:
SELECT ID, UPPER(MIN(LOGGING_STATUS)) AS STATUS, -- 用MIN/MAX都行,因为同ID状态一致,UPPER转成大写和你示例格式匹配 MIN(ZIP-CODE) AS ZIP-CODE -- 同IDZIP一致,MIN/MAX/ANY_VALUE都可以 FROM YourTableName -- 替换成你的实际表名 GROUP BY ID;
比如ID#9630全是fail,执行后会返回一行:9630 | FAIL | 8959,符合你要的单ID单行要求(你示例里写了两行,应该是笔误吧😉)。
2. 进阶场景:ID存在混合状态(既有fail又有success)
如果你的数据里有同一个ID同时存在fail和success的情况,我们可以用CASE语句标记这种混合状态:
SELECT ID, CASE WHEN COUNT(DISTINCT LOGGING_STATUS) = 1 THEN UPPER(MIN(LOGGING_STATUS)) ELSE 'MIXED' -- 可以改成你需要的其他标识,比如'PARTIAL_SUCCESS' END AS STATUS, MIN(ZIP-CODE) AS ZIP-CODE FROM YourTableName GROUP BY ID;
这个语句会自动判断:
- 当ID下只有一种状态时,输出对应的大写状态
- 当ID下同时有两种状态时,输出
MIXED(你可以根据需求改成其他描述)
3. 特殊情况:同一个ID对应多个不同ZIP-CODE
如果你的数据里同一个ID有不同的ZIP-CODE,那得先明确需求:
- 要是想按「ID+ZIP」分组(每个组合一行),就把ZIP-CODE加入
GROUP BY:
SELECT ID, CASE WHEN COUNT(DISTINCT LOGGING_STATUS) = 1 THEN UPPER(MIN(LOGGING_STATUS)) ELSE 'MIXED' END AS STATUS, ZIP-CODE FROM YourTableName GROUP BY ID, ZIP-CODE;
- 要是只想保留该ID的任意一个ZIP,继续用
MIN()/MAX()取就行。
内容的提问来源于stack exchange,提问作者poppy202
相关产品推荐
相关产品推荐

