Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2016:更新记录时按分组_Sql_Sql Server_Tsql_Sql Update_Window Functions - Fatal编程技术网

SQL Server 2016:更新记录时按分组

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

我有一个场景,其中我需要根据产品确定每个客户/企业组合的利润类型——这意味着客户/企业组合利润最高的产品应被确定为“高”利润类型。具有相同组合的所有其他产品应标识为低。因此,我需要一个SQL来相应地更新列MARGIN_类型

我尝试过这样做,但不知道如何按客户/企业组合进行分组。任何帮助都将不胜感激。谢谢大家!

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的意思。@Newbie
CASE
表达式(
CASE
Switch
)语句在t-SQL中不存在)是完全有效的。。。它做的是“罐头上写的”。当Margin的值为MaxMargin return
High
else
Low
时<代码>大小写
表达式是该语言非常基本的部分。如果你提供可消费的样品数据(不是图像),我很乐意测试以上内容/提供一个提琴。然而,你不应该期望用户转录你的数据(这可能就是你投反对票的原因)。这个错误真的会有帮助,再加上这个示例数据。。。错误与
大小写
表达式无关<代码>合并对于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)