【问题标题】:Assigning MIN(value) based on/grouped by another column根据另一列/按另一列分组分配 MIN(value)
【发布时间】:2022-01-07 15:45:21
【问题描述】:

我正在使用 Microsoft SQL (SSMS):

UPC Item Department
1 a 0
2 b 23
3 c 33
4 a 0

我正在尝试编写一个查询,如果 [Department] = 0,则将 [UPC] 分配为“部门”

在此示例中,[Item]=a 将有两个 [UPC] 值和不同的 [Department] 值。 我正在尝试根据 [Item] 分配 min([UPC] 所以我可以看到以下输出:

UPC Item Department
1 a 1
4 a 1

这是我目前所拥有的,我知道这是错误的。谁能帮我解决这个问题? 谢谢!

SELECT h.[UPC], h.[Item]
    CASE WHEN h.[Department] = 0 THEN
    CASE WHEN count(h.[UPC]) = 1 THEN h.[UPC]
        ELSE f.[Min_UPC] END
    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]
GROUP BY h.[UPC], h.[Item], f.[Min_UPC], h.[Department]

【问题讨论】:

  • 所以你需要按商品最小化UPC吗?我也没有得到“如果 [Department] = 0,将 [UPC] 分配为'Department'”语句,因为这不是示例结果集中显示的内容,其中Department1,而不是1 &4.
  • 您好,感谢您的回复。第二张表是我希望实现的,是的,是按项目计算的 MIN UPC。所以在第一个表中,由于项目 A 的部门为 0,我想为两行分配 1 作为部门。这有意义吗?
  • 旁注:不要习惯使用单引号作为标识符,例如列别名。是的,遗憾的是 SQL Server 接受了这一点,但在 SQL 中,单引号通常用于字符串(或日期......)文字。如果您曾经使用过另一个 DBMS(或者未来的 SQL Server 版本会对此更加清醒),您可能会遇到错误。对包含特殊字符或区分大小写的标识符使用方括号,或者最好根本不使用特殊字符和区分大小写的标识符。标识符不需要是“漂亮”、“漂亮”的标头等,这是表示层的工作。
  • 这是一个很好的提示,谢谢! :)

标签: sql sql-server tsql


【解决方案1】:

您可以使用min() 的窗口版本获取每个项目的最小upc,并在department 等于0 时使用CASE 表达式分配它。

SELECT upc,
       item,
       CASE
         WHEN department = 0 THEN
           min(upc) OVER (PARTITION BY item)
         ELSE
           department
       END AS department
       FROM elbat;

【讨论】:

  • 正是我所需要的。非常感谢!
  • @pepsidecay 请务必接受答案。这是一种简单的方式来表达您对贡献者的时间和才能的感激之情。它还可以作为问题已解决的指标。
猜你喜欢
  • 2021-08-28
  • 2021-08-01
  • 2020-12-11
  • 2018-09-09
  • 2020-10-28
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多