Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL统计调查结果_Sql_Sql Server - Fatal编程技术网

SQL统计调查结果

SQL统计调查结果,sql,sql-server,Sql,Sql Server,我有一个关于统计调查结果和将数据列而不是行的问题…a.VARNAME是一个问题,a.value是答案。我试图计算每个问题有多少个0,1,2,3,4,5的答案。我得到了我想要的结果,但它都在一行中…我如何才能将问题“varname”作为列标题,然后作为行回答0,1,2,3,4 select sum(CASE WHEN a.VARNAME = 'R2' and a.value = '0' then 1 else 0 end) as 'Answered 0', sum(CASE WHEN a.VAR

我有一个关于统计调查结果和将数据列而不是行的问题…a.VARNAME是一个问题,a.value是答案。我试图计算每个问题有多少个0,1,2,3,4,5的答案。我得到了我想要的结果,但它都在一行中…我如何才能将问题“varname”作为列标题,然后作为行回答0,1,2,3,4

select 
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '0' then 1 else 0 end) as 'Answered 0',
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '1' then 1 else 0 end) as 'Answered 1',
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '2' then 1 else 0 end) as 'Answered 2',
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '3' then 1 else 0 end) as 'Answered 3',
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '4' then 1 else 0 end) as 'Answered 4',
sum(CASE WHEN a.VARNAME = 'R2' and a.value = '5' then 1 else 0 end) as 'Answered 5',
sum(CASE WHEN a.VARNAME = 'R2' then 1 else 0 end) as 'Total',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '0' then 1 else 0 end) as 'Answered 0 ',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '1' then 1 else 0 end) as 'Answered 1 ',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '2' then 1 else 0 end) as 'Answered 2 ',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '3' then 1 else 0 end) as 'Answered 3',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '4' then 1 else 0 end) as 'Answered 4 ',
sum(CASE WHEN a.VARNAME = 'A1' and a.value = '5' then 1 else 0 end) as 'Answered 5 '
from survey_patient p
inner join survey_analysis a
  on p.survey_id = a.survey_id
inner join survey_question_map q
  on a.varname = q.varname and p.[service] = q.[service]
您需要varname的每行计数。这个怎么样

select a.VarName, vals.value,
       sum(case when vals.value = a.value then 1 else 0 end) as TheCount
from (select '0' as value union all
      select '1' union all
      select '2' union all
      select '3' union all
      select '4' union all
      select '5'
     ) as vals cross join
     survey_patient p inner join
     survey_analysis a
     on p.survey_id = a.survey_id inner join
     survey_question_map q
     on a.varname = q.varname and p.[service] = q.[service];
group by a.varname, vals.value;
您仅从调查分析中提取数据。如果不需要其他表,可以将其简化为:

select a.VarName, vals.value,
       sum(case when vals.value = a.value then 1 else 0 end) as TheCount
from (select '0' as value union all
      select '1' union all
      select '2' union all
      select '3' union all
      select '4' union all
      select '5'
     ) as vals cross join
     survey_analysis a
group by a.varname, vals.value;

我大学毕业后的第一份工作是在一家做医学调查的初创公司工作

我们有一份项目分析报告。基本上,每0..5计算一个答案+1作为小计,并计算一个总答案。将小计除以总计,得到平均值,并用一个漂亮的小条形图将其打印在调查问题旁边

我想这就是你想做的

让我们创建一个小测试数据库

-- Just play
USE Tempdb;
Go

-- Create the table
CREATE TABLE survey_analysis 
(
  -- links to survey_patient (FK)
  survey_id INT not null,

  -- links to survey_question_map (FK)
  varname VARCHAR(20),

  -- actual answer (0=n/a)
  varvalue INT DEFAULT 0
);
GO

-- Remove data when playing
truncate table survey_analysis;
GO

-- Create some data
insert into survey_analysis values
  (1, 'R2', 1),
  (1, 'A1', 1),
  (2, 'R2', 2),
  (2, 'A1', 2),
  (3, 'R2', 3),
  (3, 'A1', 3),
  (4, 'R2', 4),
  (4, 'A1', 4),
  (5, 'R2', 5),
  (5, 'A1', 5),
  (6, 'X1', 1),
  (6, 'X2', 2),
  (7, 'R2', 5);
GO

-- Show the data
select * from survey_analysis;
GO
虽然您有“调查患者”和“调查问题”地图表,但它们只是背景噪音。您希望在调查分析表中计算总数

-- 
-- Get sub-total by question (varname), answer(myvalue), and running total
--

SELECT  
    A.varname,
    Q.myvalue, 
    Q.myanswer, 
    SUM(CASE WHEN Q.myvalue = A.varvalue THEN 1 ELSE 0 END) as mysubtotal,
    SUM(1) as mytotal
FROM 

-- Driver table if we do not have all combinations
  (
    VALUES 
      (0, 'Answered 0'),
      (1, 'Answered 1'),
      (2, 'Answered 2'),
      (3, 'Answered 3'),
      (4, 'Answered 4'),
      (5, 'Answered 5')
  ) AS Q (myvalue, myanswer)

CROSS JOIN survey_analysis as A

-- Filter for questions with 0-5 answers
WHERE 
    A.varname in ('A1', 'R2')
GROUP BY
    A.varname,
    Q.myvalue, 
    Q.myanswer;
GO
这是我解决你问题的方法

1-为有5个答案的问题Q创建派生表

2-在调查分析中使用交叉连接,以确保我们拥有所有组合

3-使用WHERE子句进行筛选。不包括回答少于5个的问题

4-按问题、答案、答案标签分组

5-按项目包括小计和总计,以显示统计数据

如果你有一大堆问题,答案的数量不一:重复查询;调整衍生表格的答案数量;使用UNION ALL将所有结果合并到一个结果集中;添加一些id-like问题,以便您可以排序最终结果


我在where子句中使用了其他表,但我忽略了所有这些…非常感谢您的帮助。。。