C# 按组计算平均值,然后将列转换为行
我有一张“tbTest”表,如下所示: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
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;