同时行和列的SQL平均值 – 像matrix平均值

我有这样的桌子 –
在这里输入图像描述

我想按Dept分组,得到四行的总数和平均值。 输出应该看起来像 –
在这里输入图像描述
有人可以帮忙!

另一个select是与CROSS APPLY

Select A.Dept ,MonthTotal = sum(B.value) ,MonthAvg = avg(B.value) From YourTable A Cross Apply ( values (month1) ,(month2) ,(month3) ,(month4) ) B(value) Group By A.Dept 

如果您需要在Excel中构build它,请使用以下两个公式:

AVERAGEIF

SUMIF

这些公式将自动处理空值。

使用GROUP BY

  SELECT SUM(month1 + month2 + month3 + month4) AS MonthTotal, SUM(month1 + month2 + month3 + month4)/(COUNT(*) * 4) AS MonthAvg, dept FROM your_table GROUP BY dept 

首先,您需要在执行聚合之后取消数据传输

 declare @table table (Dept varchar(30), Month1 decimal(16,4), Month2 decimal(16,4), Month3 decimal(16,4), Month4 decimal(16,4)) Insert @table (Dept, Month1, Month2, Month3,Month4) values ('Medicine' , 80.06 ,80.0709 ,80.0709 ,80.8153) ,('Medicine' , 61.64 ,null ,81.8364 ,79.1241) ,('Medicine' , 48.34 ,79.0159 ,null ,null) ,('Medicine' , null ,87.5137 ,83.7288 ,75.454) ,('Non-Medicine' , 85.13 ,89.36 ,89.36 ,89.36) ,('Non-Medicine' , 82.21 ,91.2732 ,91.334 ,null) ,('Non-Medicine' , 106.19 ,NULL ,80.3801 ,82.2787) ,('Non-Medicine' , 94.44 ,75.0055 ,75.4232 ,75.4335) ,('Non-Medicine' , 119.77 ,87.6069 ,88.0649 ,null) Select Dept ,Sum(Sales) ,Avg(Sales) FROM ( SELECT Dept ,Month ,Sales FROM ( SELECT Dept ,Month1 ,Month2 ,Month3 ,Month4 FROM @table ) p UNPIVOT (Sales For Month in (Month1,Month2,Month3,Month4) ) U WHERE Sales Is not null ) x Group by Dept 

结果

 Dept Sum Agv ------------------------------ --------------------------------------- --------------------------------------- Medicine 917.6700 76.472500 Non-Medicine 1502.6200 88.389411