基于 isnull 和聚合值从嵌套查询更新统计信息
update stats from nested query based on isnull and aggregate values
我有一个名为 lt_program_data
的父系统 table,它包含 customer
数据,percents
跟踪该客户和一个 year
数据字段,如这些百分比每年都会被追踪。
百分比根据某些条件从本地化 table 填充,然后根据年份和客户值更新父级 table lt_program_data
。
然而,在某些情况下,我们只有过去的数据,而在我们有客户数据的情况下,用户请求的是,但没有与本季节对应的百分比,我们使用最大季节值。
我们现在的逻辑是这样的:
update lt_program_data
set percent = ( select percent
from #percent b
where b.year = a.fyear and b.customer = a.customer)
from lt_program_data
这很好用,但现在我们不得不说类似
如果 b.year 为空 select 我们拥有的数据的该客户的最大年份。
select *
From #lt_program_data a
join #percent b on b.fyear= isnull(a.fyear,max(a.fyear)) and b.customer = a.customer
我尝试写一个 select 然后更新,但收到以下消息:
Msg 1015, Level 15, State 1, Line 3
An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.
请帮忙解决这个问题。
这是我们的输出样本
lt_program_data
customer year .. percent .. Other columns
1 2016 ..
2 2016
1 2017
2 2017
3 2017
等
% table 看起来像这样
customer year percent
1 2016 40
2 2016 64
3 2016 11
的预期结果需要 lt_program_data
customer year percent
1 2016 40
1 2017 40
2 2016 64
2 2017 64
3 2017 NULL
它匹配百分比 table 中存在的给定年份的客户数量和百分比(因此客户 1 的值变为 40,客户 2 变为 64),因为这些客户的数据在 2017 年季节不存在,它对 2016 赛季的各个客户使用相同的数据(最大现有数据)。在客户 3 的情况下,因为它没有留下 NULL。
百分比 table 可以追溯到 2016 年,所以我们想说的是,由于我们为客户提供的最大数据可以追溯到 2016 年,我们将在 lt_program_data 中填充 2017 年的值对于 2016 年值为 40 的客户 1。
希望此查询对您有用。
update lt_program_data
set percent_poverty = case
when b.year is null -- year in #percent is null (no join found)
then (select top 1 poverty_percent -- then get first percent by ordering year descending
from #percent
where customer = a.customer
order by year desc)
else b.poverty_percent -- else get the percent
end
from lt_program_data a -- lets left join both tables on year and customer
left join #percent b on b.year = a.fyear and b.customer = a.customer
我有一个名为 lt_program_data
的父系统 table,它包含 customer
数据,percents
跟踪该客户和一个 year
数据字段,如这些百分比每年都会被追踪。
百分比根据某些条件从本地化 table 填充,然后根据年份和客户值更新父级 table lt_program_data
。
然而,在某些情况下,我们只有过去的数据,而在我们有客户数据的情况下,用户请求的是,但没有与本季节对应的百分比,我们使用最大季节值。
我们现在的逻辑是这样的:
update lt_program_data
set percent = ( select percent
from #percent b
where b.year = a.fyear and b.customer = a.customer)
from lt_program_data
这很好用,但现在我们不得不说类似 如果 b.year 为空 select 我们拥有的数据的该客户的最大年份。
select *
From #lt_program_data a
join #percent b on b.fyear= isnull(a.fyear,max(a.fyear)) and b.customer = a.customer
我尝试写一个 select 然后更新,但收到以下消息:
Msg 1015, Level 15, State 1, Line 3
An aggregate cannot appear in an ON clause unless it is in a subquery contained in a HAVING clause or select list, and the column being aggregated is an outer reference.
请帮忙解决这个问题。
这是我们的输出样本
lt_program_data
customer year .. percent .. Other columns 1 2016 .. 2 2016 1 2017 2 2017 3 2017
等
% table 看起来像这样
customer year percent 1 2016 40 2 2016 64 3 2016 11
customer year percent
1 2016 40
1 2017 40
2 2016 64
2 2017 64
3 2017 NULL
它匹配百分比 table 中存在的给定年份的客户数量和百分比(因此客户 1 的值变为 40,客户 2 变为 64),因为这些客户的数据在 2017 年季节不存在,它对 2016 赛季的各个客户使用相同的数据(最大现有数据)。在客户 3 的情况下,因为它没有留下 NULL。
百分比 table 可以追溯到 2016 年,所以我们想说的是,由于我们为客户提供的最大数据可以追溯到 2016 年,我们将在 lt_program_data 中填充 2017 年的值对于 2016 年值为 40 的客户 1。
希望此查询对您有用。
update lt_program_data
set percent_poverty = case
when b.year is null -- year in #percent is null (no join found)
then (select top 1 poverty_percent -- then get first percent by ordering year descending
from #percent
where customer = a.customer
order by year desc)
else b.poverty_percent -- else get the percent
end
from lt_program_data a -- lets left join both tables on year and customer
left join #percent b on b.year = a.fyear and b.customer = a.customer