Tsql SQL查询-计算一组问题的“是”回答数
我有一个调查相关应用的表格,其中有5个问题都需要回答是(1)或否(0)。表格设计如下:Tsql SQL查询-计算一组问题的“是”回答数,tsql,Tsql,我有一个调查相关应用的表格,其中有5个问题都需要回答是(1)或否(0)。表格设计如下: 创建表格分数( 项目id int不为空, 响应id int NULL, q1 int, q2 int, q3 int, q4 int, q5 int, ); 样本数据: project_id resp_id q1 q2 q3 q4 q5 1 86 1 1 1 1 1 1 114 1 1 1 1 1 1 118 0
创建表格分数(
项目id int不为空,
响应id int NULL,
q1 int,
q2 int,
q3 int,
q4 int,
q5 int,
);
样本数据:
project_id resp_id q1 q2 q3 q4 q5
1 86 1 1 1 1 1
1 114 1 1 1 1 1
1 118 0 1 1 1 0
2 154 1 1 0 1 1
2 178 1 1 1 0 1
3 182 1 0 1 1 1
3 190 1 1 1 0 1
3 208 1 1 1 1 1
3 300 1 1 1 0 0
3 329 1 1 1 1 1
我需要做的是编写一个查询,生成一份报告,根据项目id、提供0个“是”答案(5分之0)、1个“是”答案(5分之1)、2个“是”答案(5分之2)的受访者人数等进行细分。换句话说,有多少受访者对所有问题回答“是”,5分之4回答“是”,等等
可行吗?非常感谢您的建议:)创建了一个存储过程,并将值设置为变量,然后您可以使用存储过程中的select语句和where子句有条件地传递它们
SELECT
project_ID,
q1 + q2 + q3 + q4 + q5 AS NumYesAnswers,
COUNT(*) AS NumResponses
FROM
score
GROUP BY
project_ID, q1 + q2 + q3 + q4 + q5
编辑
我想将此作为对Lobo答案的评论,但格式不起作用。使用轴
,您可以更优雅地实现相同的效果:
SELECT
Project_ID, "0" AS NoToAll, "1", "2", "3", "4", "5"
FROM
(
SELECT Project_ID, Q1 + Q2 + Q3 + Q4 + Q5 AS NumYeses, COUNT(*) AS Answers
FROM Score
GROUP BY Project_ID, Q1 + Q2 + Q3 + Q4 + Q5
) AS X
PIVOT
(SUM(Answers) FOR NumYeses IN ("0", "1", "2", "3", "4", "5")) AS Y
各行各业的乔恩回答得很好。此外,如果不想重复sum语句,请使用CTE(公共表表达式)
With
ProYes as (
select project_id,
q1 + q2 + q3 + q4 + q5 as NumYes
from score)
select project_id, NumYes, COUNT(*) as NumAnswers
from ProYes
group by project_id, NumYes
PS:请更正样本数据标题;我无法编辑你的问题。谢谢 棒极了!这正是我想要的。Michael和Jon,您的查询也给出了正确的结果,但Lobo的格式正是我所需要的。每个项目都有一个条目,其中“是”的总和作为列。也许我应该在我的请求中提供更多的细节。谢谢大家@xtreme416-常见问题页面上说,您应该将最有用的答案标记为已接受的答案。:)@Jon of All Trade-我可以编辑,但不能对你的答案发表评论,所以我的问题是-当你只是将行转换为列时,
SUM(Answers)
是必需的吗?我想试试,但我有Sybase,它不支持pivot。谢谢
-- Be careful about NULL fields(the following is assuming that the q* are NOT NULL fields)
SELECT project_id,
SUM(allzeroes) AS NoToAll, SUM(onlyone) AS YesToOne, SUM(two) AS YesToTwo, SUM(three) AS YesToThree, SUM(four) AS YesToFour, SUM(five) AS YesToAll
FROM (
SELECT project_id,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 0 THEN COUNT(*) ELSE 0 END) AS allzeroes,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 1 THEN COUNT(*) ELSE 0 END) AS onlyone,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 2 THEN COUNT(*) ELSE 0 END) AS two,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 3 THEN COUNT(*) ELSE 0 END) AS three,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 4 THEN COUNT(*) ELSE 0 END) AS four,
(CASE WHEN (q1 + q2 + q3 + q4 + q5) = 5 THEN COUNT(*) ELSE 0 END) AS five
FROM score
GROUP BY project_id, (q1 + q2 + q3 + q4 + q5) ) temp_table
GROUP BY project_id