2013-05-02 3 views
1

Я застрял в запросе обновления. У меня есть запрос, какОбновить таблицу на основе запроса, возвращаемого в SQL Server

SELECT s_no, loan_id,repayment_date,principal,loan_balance, count(*) as repeatTimes 
FROM loan_repayment_plan_mcg 
GROUP BY s_no, loan_id, repayment_date,principal,loan_balance 
HAVING count(*) > 1 

возвращает этот вывод:

s_no loan_id repayment_date principal loan_balance repeatTimes 
1   21111 2012-03-13   0.00 5000.00   2 
2   21311 2012-04-12   0.00 2000.00   2 
3   21111 2012-05-13   500  5000.00   2 
4   21111 2012-06-14   0.00 5000.00   3 

Я хочу, чтобы обновить loan_balance умноженное на repeatTimes из моего выше запроса на выборку на основе loan_id и repayment_date, которая объединяет вместе, чтобы сделать уникальный ряд ,

+0

пожалуйста, рассмотрите, вы нарушаете 3NF этим - и для этого вам нужно правдоподобная причина (в основном проблемы с производительностью) – Najzero

+0

@Najzero это проблемы из старой системы, и я хочу исправить ее, поскольку данные повторяются. –

ответ

1

Традиционный способ, с помощью UPDATE из РЕГИСТРИРУЙТЕСЬ

update A 
set loan_balance = loan_balance * repeatTimes 
from loan_repayment_plan_mcg A 
join 
(
SELECT s_no, loan_id,repayment_date,principal,loan_balance, count(*) as repeatTimes 
FROM loan_repayment_plan_mcg 
GROUP BY s_no, loan_id, repayment_date,principal,loan_balance 
HAVING count(*) > 1 
) B on A.s_no = B.s_no 
    and A.loan_id = B.loan_id 
    and A.repayment_date = B.repayment_date 
    and A.principal = B.principal 
    and A.loan_balance = B.loan_balance; 

Использование функций окна и КТР в SQL Server 2008

;with cte as (
    SELECT *,sum(loan_balance) over (
      partition by s_no,loan_id,repayment_date,principal,loan_balance) total_balance 
    FROM loan_repayment_plan_mcg 
) 
update cte 
    set loan_balance = total_balance 
where loan_balance != total_balance; 
+0

Спасибо, я попробовал первый запрос только с небольшими изменениями. Set loan_balance = a.loan_balance * repeatTimes ' –

Смежные вопросы