多列中的TSQL计数出现次数

use*_*209 5 sql t-sql sql-server aggregate-functions

我有一个表,其中每列是一个问题,行是答案,可以假设从1到4的值

每个问题计算每个答案的出现次数的最有效方法是什么?

输入表

q1  q2  q3
1   3   1
2   1   4
1   2   1
Run Code Online (Sandbox Code Playgroud)

期望的输出表

answer  q1  q2  q3

    1   2   0   2
    2   1   1   0
    3   0   1   0   
    4   0   0   1
Run Code Online (Sandbox Code Playgroud)

到目前为止,我到达了以下(针对q3问题),但这只是针对一个问题

CREATE TABLE #t
  (
    answer int
  )
insert into #t (answer) values (1)
insert into #t (answer) values (2)
insert into #t (answer) values (3)
insert into #t (answer) values (4)

select * into #q3 from (select q3 as q3,count(*) as occurenceq3
                    from [table]
                    group by q3) as x

select t.answer,tb.occurenceq3 as occurenceq3
from #t t left join #q3 tb on t.answer=tb.Q3

drop table #q3
drop table #t
Run Code Online (Sandbox Code Playgroud)

sha*_*t00 5

select answer, q1, q2, q3
from
    q
    unpivot (answer for q in (q1, q2, q3)) as upvt
    pivot (count(q) for q in (q1, q2, q3)) as pvt
Run Code Online (Sandbox Code Playgroud)

我犯了第一次尝试的错误,count(*)但我认为聚合必须明确地在被转动的列上,即使我认为它们在逻辑上是等价的.