这会在不丢失其他列的情况下为您提供两列的平均年龄:
select
*
, avg(case when Gender = 'Male' then null else age end) over(partition by Gender) avgAge_Female
, avg(case when Gender = 'Female' then null else age end) over(partition by Gender) avgAge_Male
from
(
select
f1.*
, datediff(
year
, cast(
concat(
concat('19', left(f1.vl, 2))
, '-'
, right(left(f1.vl, 4), 2)
, '-'
, right(f1.vl, 2)
)
as date)
, getdate()
) age
from
(
select
ID,
UserName,
concat(FirstName,' ',LastName) as Name,
left(ID, charindex('-', ID) - 1) vl,
iif(substring(ID,10,1) % 2 =0,'Female', 'Male') as Gender
from Users
) f1
) g1
编辑:合并为一栏版本:
注意:为了便于理解,我使用了子查询,因此它不是优化查询。
select
h1.ID
, h1.UserName
, h1.Name
, h1.Gender
, isnull(h1.avgAge_Male, h1.avgAge_Female) avgAge_MaleOrFemale
from
(
select
*
, avg(case when Gender = 'Male' then null else age end) over(partition by Gender) avgAge_Female
, avg(case when Gender = 'Female' then null else age end) over(partition by Gender) avgAge_Male
from
(
select
f1.*
, datediff(
year
, cast(
concat(
concat('19', left(f1.vl, 2))
, '-'
, right(left(f1.vl, 4), 2)
, '-'
, right(f1.vl, 2)
)
as date)
, getdate()
) age
from
(
select
ID,
UserName,
concat(FirstName,' ',LastName) as Name,
left(ID, charindex('-', ID) - 1) vl,
iif(substring(ID,10,1) % 2 =0,'Female', 'Male') as Gender
from Users
) f1
) g1
) h1