我有一个如下所示的SQL代码:
select cast(avg(age) as decimal(16,2)) as 'avg' From
(select distinct acct.Account, cast(Avg(year(getdate())- year(client_birth_date)) as decimal(16,2)) as 'Age'
from WF_PM_ACCT_DB DET
inner join WF_PM_ACCT_DET_DB ACCT
ON det.Account = acct.Account
where (acct_closing_date is null or acct_closing_date > '2017-01-01')
and Acct_Open_Date < '2017-01-01'
group by acct.Account
) x
那么基本上这给我的是一个简单的单元格答案,即Acct_Open_Date&lt;年度帐户的平均年龄。 &#39; 2017年1月1日&#39; 。我是一个人,所以我每次都更改日期并一次又一次地运行查询以获得剩余的一年。是否有一种简单的方法可以说让我们将所有年份作为列标题,并且只有一行具有该年度的平均帐户年龄。
请注意,帐户截止日期为空意味着帐户永远不会关闭,我必须将其更改为低于分析年份才能真实了解当时存在的平均帐户年龄
感谢任何帮助。谢谢。
答案 0 :(得分:2)
您可以通过将它们包含在单个派生表中来运行多个日期:
with dates as (
select cast('2017-01-01' as date) as yyyy union all
select cast('2016-01-01' as date)
)
select yyyy, cast(avg(age) as decimal(16,2)) as avg_age
From (select dates.yyyy, acct.Account,
cast(Avg(year(getdate())- year(client_birth_date)) as decimal(16,2)) as Age
from dates cross join
WF_PM_ACCT_DB DET inner join WF_PM_ACCT_DET_DB
ACCT
on det.Account = acct.Account
where (acct_closing_date is null or acct_closing_date > dates.yyyy) and
Acct_Open_Date < dates.yyyy
group by acct.Account, dates.yyyy
) x
group by yyyy
order by yyyy;