I’ve this below select statement. Over there I’ve 2 derived columns EmpContbtnWithoutTax and EmpContbtnWithTax I wanted to have that data permanently in that same table EmpPFContributionTest
Need help to have that update query for EmpPFContributionTest table which update the respective rows of EmpContbtnWithoutTax and EmpContbtnWithTax columns permanently. Update script which I was trying for 1 column first mentioned below
x
update t2
set EmpContbtnWithoutTax =
(
select case when sum(isnull(t1.emp_contribution,0)) over(partition by
t1.emp_no order by (t1.pcm_year * 100 + t1.pcm_month)) +
sum(isnull(vpf,0)) over(partition by t1.emp_no order by (t1.pcm_year *
100 + t1.pcm_month)) < 3000
then sum(isnull(t1.emp_contribution,0)) over(partition by
t1.emp_no order by (t1.pcm_year * 100 + t1.pcm_month)) +
sum(isnull(vpf,0)) over(partition by t1.emp_no order by (t1.pcm_year *
100 + t1.pcm_month))
else null
end
from EmpPFContributionTest t1
)
from EmpPFContributionTest t2
/*Actual Select Statement */
select case when sum(isnull(emp_contribution,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) + sum(isnull(vpf,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) < 3000
then sum(isnull(emp_contribution,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) + sum(isnull(vpf,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month))
else null
end
empcontbtnwithouttax,
case when sum(isnull(emp_contribution,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) + sum(isnull(vpf,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) >= 3000
then sum(isnull(emp_contribution,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month)) + sum(isnull(vpf,0)) over(partition by emp_no order by (pcm_year * 100 + pcm_month))
else null
end
empcontbtnwithtax,
* from [dbo].EmpPFContributionTest
where
(pcm_year * 100 + pcm_month >= 201504) AND
(pcm_year * 100 + pcm_month < 201604)
and emp_no= 11101201
order by (pcm_year * 100 + pcm_month)
Advertisement
Answer
It look like you’re trying to update two existing columns in the same table?
It’s not a good pattern to use where the data is computed from existing data – when the data changes your computed values are instantly invalidated.
Having said that, to do what you are asking you can simply use an updatable CTE, something like:
with tax as (
select case when sum(isnull(emp_contribution,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) + sum(isnull(vpf,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) < 3000
then sum(isnull(emp_contribution,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) + sum(isnull(vpf,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month)
else null
end as withouttax,
case when sum(isnull(emp_contribution,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) + sum(isnull(vpf,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) >= 3000
then sum(isnull(emp_contribution,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month) + sum(isnull(vpf,0)) over(partition by emp_no order by pcm_year * 100 + pcm_month)
else null
end as withtax
from dbo.EmpPFContributionTest
where
pcm_year * 100 + pcm_month >= 201504
and pcm_year * 100 + pcm_month < 201604
and emp_no = 11101201
)
update tax set
EmpContbtnWithoutTax = withouttax
empcontbtnwithtax = withtax