SQL Server 2016:更新记录时按分组
我有一个场景,其中我需要根据产品确定每个客户/企业组合的利润类型——这意味着客户/企业组合利润最高的产品应被确定为“高”利润类型。具有相同组合的所有其他产品应标识为低。因此,我需要一个SQL来相应地更新列MARGIN_类型 我尝试过这样做,但不知道如何按客户/企业组合进行分组。任何帮助都将不胜感激。谢谢大家!SQL Server 2016:更新记录时按分组,sql,sql-server,tsql,sql-update,window-functions,Sql,Sql Server,Tsql,Sql Update,Window Functions,我有一个场景,其中我需要根据产品确定每个客户/企业组合的利润类型——这意味着客户/企业组合利润最高的产品应被确定为“高”利润类型。具有相同组合的所有其他产品应标识为低。因此,我需要一个SQL来相应地更新列MARGIN_类型 我尝试过这样做,但不知道如何按客户/企业组合进行分组。任何帮助都将不胜感激。谢谢大家! UPDATE ORDER_TABLE SET MARGIN_TYPE = 'High' where MARGIN = (SELECT MARGIN FROM (SELECT MAX(MAR
UPDATE ORDER_TABLE
SET MARGIN_TYPE = 'High'
where MARGIN = (SELECT MARGIN FROM (SELECT MAX(MARGIN) FROM ORDER_TABLE) AS
MARGIN)
我想您只需要一个可更新的CTE:
WITH CTE AS(
SELECT Customer,
Margin,
MarginType,
MAX(Margin) OVER (PARTITION BY Customer) AS MaxMargin
FROM dbo.YOurTable)
UPDATE CTE
SET MarginType = CASE Margin WHEN MaxMargin THEN 'High' ELSE 'Low' END;
使用可更新的CTE:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY CUSTOMER, BUSINESS ORDER BY MARGIN DESC) rn
FROM ORDER_TABLE
)
UPDATE cte
SET MARGIN_TYPE = CASE WHEN rn = 1 THEN 'High' ELSE 'Low' END
请使用下面的查询
merge into ORDER_TABLE OT
using (select customer, business, product, margin, case when rnk = 1 then 'High' else
'Low' end as MARGIN_TYPE
select customer, business, product, margin, row_number() over (partition by customer,
business, product, margin order by margin desc) as rnk
from ORDER_TABLE
group by) QRY
on (OT.customer = QRY.customer and OT.business = QRY.business and OT.margin =
QRY.margin)
when matched then
update
set
OT.MARGIN_TYPE = QRY.MARGIN_TYPE;
谢谢你的回答。我不认为这也会按业务分组。会吗?然后通过,@Newbie将
业务
添加到分区。我是基于我们拥有的(非常)小样本集,其中Customer
和Business
同时发生变化。谢谢@Larnu。CASE语句似乎有一些问题,我不明白MaxMargin的意思。@NewbieCASE
表达式(CASE
(Switch
)语句在t-SQL中不存在)是完全有效的。。。它做的是“罐头上写的”。当Margin的值为MaxMargin returnHigh
elseLow
时<代码>大小写
表达式是该语言非常基本的部分。如果你提供可消费的样品数据(不是图像),我很乐意测试以上内容/提供一个提琴。然而,你不应该期望用户转录你的数据(这可能就是你投反对票的原因)。这个错误真的会有帮助,再加上这个示例数据。。。错误与大小写
表达式无关<代码>合并对于OP想要做的事情来说是过分的。我建议你看看拉努的答案。
UPDATE ORD
SET MARGIN_TYPE = case ORD.margin = m.margin then 'high' else 'low' end
from ORDER_TABLE ORD
left outer join
(SELECT customer,business,MAX(MARGIN) MARGIN
FROM ORDER_TABLE
group by customer,business) m
on(ORD.customer = m.customer and ORD.business = m.business)