我在SQL数据库中有调查回复。分数是1-5。
数据表的当前格式是:
Survey_id, Question_1, Question_2, Question_3
383838, 1,1,1
392384, 1,5,4
393894, 4,3,5
我正在运行一个新查询,我需要%4' s,%5' s问题并不重要,只是总体而言。
乍一看我在想
sum(iif(Question_1 =5,1,0)) + sum(iif(Question_2=5,1,0)) .... as total5s
sum(iif(Question_1=4,1,0)) + sum(iif(Question_2=4,1,0)) .... as total4s
但我不确定这是否是实现这一目标的最快捷或最优雅的方式。
编辑:嗯,在第一次测试时,此查询已经显示无法正常工作
EDIT2:我想在我的例子中需要总和而不是计数,会编辑。
答案 0 :(得分:1)
您必须取消数据的显示并计算之后的%响应。由于问题数量有限,您可以使用union all
取消数据的转移。
select 100.0*count(case when question=4 then 1 end)/count(*) as pct_4s
from (select survey_id,question_1 as question from tablename
union all
select survey_id,question_2 from tablename
union all
select survey_id,question_3 from tablename
) responses
另一种方法可以是
select 100.0*(count(case when question_1=4 then 1 end)
+count(case when question_2=4 then 1 end)
+count(case when question_3=4 then 1 end))
/(3*count(*))
from tablename
建议使用unpivot
作为@Dudu,
with unpivoted as (select *
from tablename
unpivot (response for question in (question_1,question_2,question_3)) u
)
select 100.0*count(case when response=4 then 1 end)/count(*)
from unpivoted