Tsql SQL查询-计算一组问题的“是”回答数

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

我有一个调查相关应用的表格,其中有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  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