取两列sql的平均值
嗨,我有两个列avg_男和avg_女如何取两个列的平均值并显示在第三个列中。请帮助使用简单的数学:取两列sql的平均值,sql,sql-server,Sql,Sql Server,嗨,我有两个列avg_男和avg_女如何取两个列的平均值并显示在第三个列中。请帮助使用简单的数学: Select Age, (select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as avg_male, (select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.ag
Select Age,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as avg_male,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Female') as avg_female
from [dbo].[Transaction] t1
group by Age ORDER BY Age
编辑:
我认为这应该行得通。没有SQLFiddle,但它应该可以:
select avg_male
, avg_female
, ( avg_male + avg_female) / 2
from transaction
使用avgx+avgy/2,两列的权重将相同,即使它们没有相同数量的条目。如果要对两列中的所有值进行算术平均,则需要将它们相加,然后除以它们的总计数:
SUM和COUNT聚合函数可帮助您计算这些值:
SELECT (sum_male + sum_female) / (count_male + count_female)
FROM transaction
如果所有记录均为男性或女性儿童性别,则这是一个更为简单的解决方案。以下内容应适用。它做的和你做的一样,但是第三列计算的是平均数,没有考虑性别 如果只有男性或女性儿童
(select sum(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as sum_male,
(select sum(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Female') as sum_female
(select count(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as count_male,
(select count(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Female') as count_female
如果有一些不是男性或女性,你只想要男性和女性的平均值
Select Age,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as avg_male,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Female') as avg_female
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age as avg_avg
from [dbo].[Transaction] t1
group by Age ORDER BY Age
一个有用的知识是从聚合中排除NULL 这意味着AVG{1,2,3,NULL}是2。1+2+3/3 下面使用CASE使某些记录无效可以简化事情
;with CTE AS
(
select 0 avg_male ,avg(ShoeSize) avg_female from [Transaction] ChildGender='Female'
union
select avg(ShoeSize) avg_male ,0 avg_female from [Transaction] ChildGender='Male'
)
select
SUM(avg_male) avg_male,SUM(avg_female),(SUM(avg_male) avg_male+SUM(avg_female))/2 Total
from CTE
这个技巧也适用于求和、计数等。请在我编写的同一个查询中告诉我,因为我的实际表是Transaction,那么加权平均值呢?例如,如果有10名男性和100名女性。@MatBailie:这不是问题,但我认为Matthias Meid的答案是正确的。@MatBailie:你可以从答案中取两个总和,然后除以二。@Patrickhoffman-这是一个未加权的平均数,而不是加权平均数。看看我的答案。要做第三列,你可以简单地做相同的平均值计算,而不考虑where子句中的性别。谢谢你参考我的答案。我已经修改了我的答案,以考虑他的表中是否不止男性和女性。为什么不使用avg功能?@vini假设您的数据库中有20个男孩,全部10岁,30个女孩,全部5岁。avgboys+avggirls/2=10+5/2=7.5,而sumboys+sumgirs/countboys+countgirls=200+150/20+30=7。与前者不同,后者的计算考虑到女孩多于男孩的事实,导致平均年龄较低。看到区别了吗?没有对错之分,有两个不同的公式,由你决定哪一个是你所需要的。
Select Age,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Male') as avg_male,
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age and t2.ChildGender='Female') as avg_female
(select avg(ShoeSize) from [dbo].[Transaction] t2 where t2.age = t1.Age AND (t2.ChildGender='Male' OR t2.ChildGender='Female') as avg_avg
from [dbo].[Transaction] t1
group by Age ORDER BY Age
;with CTE AS
(
select 0 avg_male ,avg(ShoeSize) avg_female from [Transaction] ChildGender='Female'
union
select avg(ShoeSize) avg_male ,0 avg_female from [Transaction] ChildGender='Male'
)
select
SUM(avg_male) avg_male,SUM(avg_female),(SUM(avg_male) avg_male+SUM(avg_female))/2 Total
from CTE
SELECT
Age,
AVG(CASE WHEN ChildGender = 'Male' THEN ShoeSize ELSE NULL END) AS avgMale,
AVG(CASE WHEN ChildGender = 'Female' THEN ShoeSize ELSE NULL END) AS avgFemale,
AVG( ShoeSize ) AS avgAll
FROM
[dbo].[Transaction]
GROUP BY
Age