簡體   English   中英

包含外部引用的聚合表達式中的多個列

[英]Multiple Columns in Aggregated Expression Containing Outer Reference

我有一個更大的查詢的以下部分(外部申請被用於超出此問題范圍的原因):

select top 100 *
from (
    select SSN, Program, Year, Cycle,
        case when (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)=0 and Year != last_value(Year) over(order by Year ROWS between unbounded preceding and unbounded following))
            or (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)-1900)*2+lead(Cycle,1,0) over (partition by SSN, Program order by Year, Cycle)-((Year-1900)*2+Cycle)>2
        then ((Year-1900)*2+Cycle)*2 else null end as ExitQuarter
    from dbo.Temp_Cohort
    where Program!='BSG' and Program!='BSD'
) as R
outer apply
(
    select sum(case when (Year-1900)*4+Quarter>R.ExitQuarter and (Year-1900)*4+Quarter<R.ExitQuarter+5 then Wage else null end) as Wage1,
    sum(case when (Year-1900)*4+Quarter>R.ExitQuarter+4 and (Year-1900)*4+Quarter<R.ExitQuarter+9 then Wage else null end) as Wage2,
    sum(case when (Year-1900)*4+Quarter>R.ExitQuarter+8 and (Year-1900)*4+Quarter<R.ExitQuarter+13 then Wage else null end) as Wage3,
    sum(case when (Year-1900)*4+Quarter>R.ExitQuarter+12 and (Year-1900)*4+Quarter<R.ExitQuarter+17 then Wage else null end) as Wage4,
    sum(case when (Year-1900)*4+Quarter>R.ExitQuarter+16 and (Year-1900)*4+Quarter<R.ExitQuarter+21 then Wage else null end) as Wage5
    from dbo.Wage_Hist
    where SSN=R.SSN
) as W

當我執行時,我收到以下錯誤: Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then that outer reference must be the only column referenced in the expression. Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then that outer reference must be the only column referenced in the expression.

您有解決方法或修復方法的建議嗎?

select top 100 *
from (
    select SSN, Program, Year, Cycle,
        case when (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)=0 and Year != last_value(Year) over(order by Year ROWS between unbounded preceding and unbounded following))
            or (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)-1900)*2+lead(Cycle,1,0) over (partition by SSN, Program order by Year, Cycle)-((Year-1900)*2+Cycle)>2
        then ((Year-1900)*2+Cycle)*2 else null end as ExitQuarter
    from dbo.Temp_Cohort
    where Program!='BSG' and Program!='BSD'
) as R
outer apply
(
    SELECT [1] Wage1, [2] Wage2, [3] Wage3, [4] Wage4, [5] Wage5
    FROM (
        SELECT Wage, (R.ExitQuarter-((Year-1900)*4+Quarter)+3) / 4) WagePeriod
        FROM dbo.Wage_Hist
        WHERE SSN=R.SSN
    ) p1
    PIVOT(SUM(Wage) FOR WagePeriod IN ([1],[2],[3],[4],[5])) p2
) as W

這是最終的解決方案...... Anon讓我到了正確的地方,但只需要一些語法和數學修復。

select top 100 *
from (
    select SSN, Program, Year, Cycle,
        case when (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)=0 and Year != last_value(Year) over(order by Year ROWS between unbounded preceding and unbounded following))
            or (lead(Year,1,0) over (partition by SSN, Program order by Year, Cycle)-1900)*2+lead(Cycle,1,0) over (partition by SSN, Program order by Year, Cycle)-((Year-1900)*2+Cycle)>2
        then ((Year-1900)*2+Cycle)*2 else null end as ExitQuarter
    from dbo.Temp_Betty_Cohort
    where Program!='BSG' and Program!='BSD'
) as R
outer apply
(
    select [1] as Wage1, [2] as Wage2, [3] as Wage3, [4] as Wage4, [5] as Wage5
    from
    (
        select Wage, round(((Year-1900)*4+Quarter-R.ExitQuarter+3)/4,0,1) as Period
        from dbo.Wage_Hist
        where SSN=R.SSN
    ) as S
    pivot
    (
        sum(Wage) for Period in ([1],[2],[3],[4],[5])
    ) as P
) as H

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM