SQL创建数据透视功能

时间:2017-05-13 01:16:34

标签: sql sql-server

我有一个如下所示的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; 。我是一个人,所以我每次都更改日期并一次又一次地运行查询以获得剩余的一年。是否有一种简单的方法可以说让我们将所有年份作为列标题,并且只有一行具有该年度的平均帐户年龄。

请注意,帐户截止日期为空意味着帐户永远不会关闭,我必须将其更改为低于分析年份才能真实了解当时存在的平均帐户年龄

感谢任何帮助。谢谢。

1 个答案:

答案 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;