Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取两列sql的平均值_Sql_Sql Server - Fatal编程技术网

取两列sql的平均值

取两列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

嗨,我有两个列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.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