SSMS中如何按Item分组取MIN(UPC)赋值给值为0的Department字段
原SQL问题说明
你写的语句存在两处问题:
- 语法错误:
SELECT h.[UPC], h.[Item]后缺少逗号,执行时会直接报错 - 逻辑冗余:外层
GROUP BY和count(h.[UPC])的判断完全多余,你已经在子查询中计算好了每个Item分组对应的最小UPC,无需额外聚合判断
正确写法
方案1:窗口函数写法(推荐,SQL Server 2008及以上版本支持,无需关联查询)
SELECT [UPC], [Item], CASE WHEN [Department] = 0 THEN MIN([UPC]) OVER (PARTITION BY [Item]) ELSE [Department] END AS Department FROM [table] -- 若只需输出原Department为0的处理后结果,取消注释下面的WHERE条件即可匹配你的示例输出 -- WHERE [Department] = 0
方案2:修正你的原有JOIN写法
SELECT h.[UPC], h.[Item], CASE WHEN h.[Department] = 0 THEN f.[Min_UPC] ELSE h.[Department] END AS Department FROM [table] h LEFT JOIN ( SELECT [Item], MIN([UPC]) AS Min_UPC FROM [table] GROUP BY [Item] ) f ON h.[Item] = f.[Item] -- 若只需输出原Department为0的处理后结果,取消注释下面的WHERE条件即可匹配你的示例输出 -- WHERE h.[Department] = 0
两种写法针对你的示例数据执行后,Item为a的两条记录Department都会被替换为分组最小UPC值1,符合需求。
内容的提问来源于stack exchange,提问作者pepsidecay
相关产品推荐
相关产品推荐

