基于 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 
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