Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
C# 按组计算平均值,然后将列转换为行_C#_Sql_Sql Server - Fatal编程技术网

C# 按组计算平均值,然后将列转换为行

C# 按组计算平均值,然后将列转换为行,c#,sql,sql-server,C#,Sql,Sql Server,我有一张“tbTest”表,如下所示: id | q1 | q2 | q3 | type ---+----+----+----+--------- 1 | 1 | 2 | 3 | student 2 | 2 | 1 | 3 | student 3 | 1 | 3 | 2 | student 4 | 3 | 1 |NULL| alumni 5 | 2 | 1 |NULL| alumni 6 | 2 | 2 | 1 | student 现在我想要平均Gr

我有一张“tbTest”表,如下所示:

id | q1 | q2 | q3 | type
---+----+----+----+---------
 1 |  1 |  2 |  3 | student
 2 |  2 |  1 |  3 | student
 3 |  1 |  3 |  2 | student
 4 |  3 |  1 |NULL| alumni
 5 |  2 |  1 |NULL| alumni
 6 |  2 |  2 |  1 | student
现在我想要平均GroupWise并像它一样转换:

q  | Student | Alumni
---+---------+--------    
q1 |   1.5   |  2.5
q2 |   2     |  1
q3 |   2.5   |  NULL

您想要的操作在不同的RDBMS中通常称为
PIVOT
,但它不是标准的SQL,也不是每个RDBMS都支持的

如果您没有很多组,那么可以对每个组的查询进行硬编码(就像@Dusan建议的那样)

基于C#标记,我假设您使用的是SQL Server。我的建议是使用apply取消填充数据,然后重新聚集:

select v.q,
       avg(case when t.type = 'student' then v.val * 1.0 end) as student,
       avg(case when t.type = 'alumni' then v.val * 1.0 end) as alumni
from tbTest t cross apply
     (values ('q1', t.q1), ('q2', t.q2), ('q3', t.q3)) v(q, val)
group by v.q;
类似的逻辑可以在其他数据库中使用
union-all
或显式
union-all
实现


是一个DBFIDLE。

对q1、q2和q3进行联合查询。在每个
q
查询中,您然后对
student
进行
AVG
,对
校友进行
AVG
。在每个
AVG
中,您可以使用
type
CASE
列值仅应用给定类型的值。用您正在使用的数据库标记您的问题。我不知道为什么关闭此问题。关于堆栈溢出的相关问题,我(以及另外两位提供答案的人)似乎很清楚。唯一的缺点是缺少特定的数据库标记。您好Gordon@[1144035],我使用了Microsoft SQL Server。我遇到了如下错误:“Msg 4104,16级,状态1,第2行无法绑定多部分标识符“q.val”。Msg 4104,16级,状态1,第3行无法绑定多部分标识符“q.val”。@NeloySarothi。对不起,先生,这是我的错,我没有注意到有一些错误,比如列名。修改后的SQL现在可以快速运行。谢谢你的帮助
select v.q,
       avg(case when t.type = 'student' then v.val * 1.0 end) as student,
       avg(case when t.type = 'alumni' then v.val * 1.0 end) as alumni
from tbTest t cross apply
     (values ('q1', t.q1), ('q2', t.q2), ('q3', t.q3)) v(q, val)
group by v.q;