Sql 如何按类型计算值并将列转换为行

Sql 如何按类型计算值并将列转换为行,sql,sql-server,Sql,Sql Server,我有一个表“tbTest1”,如下所示: q1 | q2 | q3 | type ---+----+----+----------- 3 | 2 | 2 | Student 2 | 2 | 3 | Student 3 | 1 | 1 | Alumni 1 | 1 | 3 | Student 1 | 3 | 2 | Alumni 现在我想把“tbTest1”转换成这样,学生为“q1”、“q2”和“q3”给出了多少个1、2或3: q | 1 | 2 | 3 ---+

我有一个表“tbTest1”,如下所示:

q1 | q2 | q3 | type
---+----+----+-----------
 3 |  2 |  2 | Student
 2 |  2 |  3 | Student
 3 |  1 |  1 | Alumni
 1 |  1 |  3 | Student
 1 |  3 |  2 | Alumni
现在我想把“tbTest1”转换成这样,学生为“q1”、“q2”和“q3”给出了多少个1、2或3:

q  | 1 | 2 | 3
---+---+---+---
q1 | 1 | 1 | 1
q2 | 1 | 2 | 0
q3 | 0 | 1 | 2

您可以使用条件聚合:

select v.q,
       sum(case when val = 1 then 1 else 0 end) as val_1,
       sum(case when val = 2 then 1 else 0 end) as val_2,
       sum(case when val = 3 then 1 else 0 end) as val_3
from tbTest t cross apply
     (values ('q1', t.q1), ('q2', t.q2), ('q3', t.q3)) v(q, val)
where t.type = 'student'
group by v.q;

现在我不想要总数,我想数一数学生为“q1”、“q2”和“q3”给出了多少个1、2或3@NeloySarothi。我改变了答案。我想再增加一列‘Aver’平均值,其中[(1*x+2*y+3*z)/学生人数](例如:对于‘q1’:-1*1+2*1+3*1=6/3=2)’选择v.q,sum(val=1的情况下,其他1个0结束)作为val_1,sum(val=2的情况下,其他1个0结束)作为val_2,sum(val=3的情况下,其他1个0结束)作为val_3,avg(当t.userType='student'然后v.val*1.0 end)作为tbTest2的平均值时,t交叉应用(值('q1',t.q1),('q2',t.q2),('q3',t.q3))v(q,val),其中t.userType='student'组由v.q;我使用了这个sql,它解决了我的问题。感谢您的帮助@Gordon Linoff