根据另一个更新列

时间:2018-07-13 08:20:55

标签: sql sql-server

我想根据'n_paiement'的值和'montant_dernier_paiement'的值(其中'is_paiement'= 1)更新列“ montant_dernier_paiement”:

enter image description here

目前还不太清楚,我想为8-9-10行设置“ montant_dernier_paiement” = 25.78,为12-13行设置= 13.81

有人有什么想法/线索吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

尝试一下:

update q
set montant_dernier_paiement = c.montant_dernier_paiement
from tbl q join tbl c
on c.n_paiement = q.n_paiement and c.is_paiement = 1

答案 1 :(得分:0)

尝试这样的事情...

UPDATE table_name set montant_dernier_paiement = 25.78 WHERE n_paiement = 1

UPDATE table_name set montant_dernier_paiement = 13.81 WHERE n_paiement = 2

答案 2 :(得分:0)

如果每个n_paiment仅具有一个值,则可以使用简单的窗口函数:

with toupdate as (
      select t.*,
             max(montant_dernier_paiment) over (partition by n_paiement) as max_mdp
      from t
     )
update toupdate
    set montant_dernier_paiment = max_mdp
    where montant_dernier_paiment <> max_mdp or (montant_dernier_paiment is null and max_mdp is not null);

如果上述内容不正确,那么您等于lag(ignore nulls)。 SQL Server不支持此功能,但是您可以使用first_value()

with toupdate as (
      select t.*,
             max(montant_dernier_paiment) over (partition by n_paiement) as max_mdp,
             first_value(montant_dernier_paiment) over
                 (partition by n_paiement
                  order by (case when montant_dernier_paiment is null then 1 else 2 end) desc,
                            tri desc
                 ) as prev_mdp                     
      from t
     )
update toupdate
    set montant_dernier_paiment = prev_mdp
    where montant_dernier_paiment <> prev_mdp or (montant_dernier_paiment is null and prev_mdp is not null);

您也可以使用apply来表达这一点:

update t
    set montant_dernier_paiment = t2.montant_dernier_paiment
    from t cross apply
         (select top (1) t.*
          from t t2
          where t2.n_paiement = t.n_paiement and
                t2.tri < t.tri and
                t2.montant_dernier_paiment is not null
          order by t2.tri desc
         ) t2
    where t.montant_dernier_paiment <> t2.montant_dernier_paiment or (t.montant_dernier_paiment is null and t2.montant_dernier_paiment is not null);