使用SQL Server中的两个条目(值)在同一表中使用另一列更新一列

时间:2018-10-07 13:03:09

标签: sql sql-server

我正在尝试从同一表中名为Product_Group的列更新Product列。该Product列有两个条目,SimpleOthers。即在下面的Invoice表中显示:

Invoice Table

我遇到的问题是,如果您查看顶级ID 10、19、21和30,则有多个条目,并且产品也有多个条目(即“简单”和“其他”)。

我想要实现的是,当我看到具有Simple和Others的Top_Level时,将Product_Group列更新为“ Simple / Other”

Final outcome

我该如何实现?

请注意,我已经搜索过类似的帖子,但没有得到我想要达到的目标。

2 个答案:

答案 0 :(得分:2)

如果您只有2个产品,则可以使用:

WITH cte AS (
   SELECT Top_Level, COUNT(DISTINCT Product) AS cnt
   FROM tab
   GROUP BY Top_Level
)
UPDATE t
SET Product_group = CASE WHEN cnt = 1 THEN t.Product ELSE 'Others/Simple' END;
FROM tab t
JOIN cte ctab
  ON c.Top_Level = t.Top_Level;

答案 1 :(得分:0)

您只有两组,因此可以使用窗口功能min()max()

select i.*,
       (case when min(product) over (partition by top_level) =
                  max(product) over (partition by top_level)
             then product
             else 'Other/Simple'
        end) as product_group
from invoices i;

如果min(product) over (partition by top_level)可能是product,则您想使用NULL

这种方法不能(轻松地)推广到两个以上的小组。但是在这种情况下应该可以正常工作。

编辑:

如果您实际上要更新列,只需使用CTE:

with toupdate as (
      select i.*,
             (case when min(product) over (partition by top_level) =
                        max(product) over (partition by top_level)
                   then product
                   else 'Other/Simple'
              end) as new_product_group
      from invoices i
     )
update toupdate
    set product_group = new_product_group;