我正在尝试从同一表中名为Product_Group
的列更新Product
列。该Product
列有两个条目,Simple
或Others
。即在下面的Invoice
表中显示:
我遇到的问题是,如果您查看顶级ID 10、19、21和30,则有多个条目,并且产品也有多个条目(即“简单”和“其他”)。
我想要实现的是,当我看到具有Simple和Others的Top_Level时,将Product_Group列更新为“ Simple / Other”
我该如何实现?
请注意,我已经搜索过类似的帖子,但没有得到我想要达到的目标。
答案 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;