2017-01-24 5 views
0

Во-первых, я пытался найти ответ, но, честно говоря, не знаю точно, что искать ...SQL запросов для анализа результатов обследования

У меня есть набор данных, я импортировать в SQL Server и нужно получить от него полезные данные. Вот формат ...

Teacher  Period Question1 Question2 Question3 
Jane Doe 1   Agree  Agree  Strongly Agree 
Jane Doe 2   Disagree  Agree  Agree 
John Doe 2   Agree  Disagree  Agree 
John Doe 4   Disagree  Agree  Strongly Disagree 
Jane Doe 3   Agree  Agree  Agree 

и так далее ... Что мне нужно, чтобы иметь возможность возвращать количество различных ответов Джейн Доу для Question1, question2 и т.д. Мне нужно вернуться к Question1 Джейн , есть 2 соглашения и 1 не согласны. Мне это нужно для нескольких учителей.

Я попытался использовать GROUP BY, но я не должен делать что-то правильно. Я пробовал вариации:

SELECT Teacher, COUNT(Q1) AS Q1Result, COUNT(Q2) AS Q2Result 
FROM Survey 
GROUP BY Teacher, Q1, Q2 

Спасибо за вашу помощь!

EDIT

Таким образом, это вопрос, который в конечном итоге получить, что мне нужно. Мои данные должны быть отключены. Я считаю, что это намного проще. Это вопрос, который получил меня, что я искал ...

SELECT s.Teacher, 
     q.Question, 
     COUNT(CASE WHEN val = 'Strongly Agree' THEN 1 END) StronglyAgreeCount, 
     COUNT(CASE WHEN val = 'Agree' THEN 1 END) AgreeCount, 
     COUNT(CASE WHEN val = 'Neutral' THEN 1 END) NeutralCount, 
     COUNT(CASE WHEN val = 'Disagree' THEN 1 END) DisagreeCount, 
     COUNT(CASE WHEN val = 'Strongly Disagree' THEN 1 END)  StronglyDisagreeCount 
FROM PCSSSurvey s 
     CROSS APPLY (VALUES(s.Q1, 'Question01'),(s.Q2, 'Question02'),(s.Q3, 'Question03'),(s.Q4, 'Question04'),(s.Q5, 'Question05'),(s.Q6, 'Question06'),(s.Q7, 'Question07'),(s.Q8, 'Question08'),(s.Q9, 'Question09'),(s.Q10, 'Question10'),(s.Q11, 'Question11'),(s.Q12, 'Question12'),(s.Q13, 'Question13')) q(val,question) 
GROUP BY s.Teacher, q.Question 
ORDER BY s.Teacher, q.Question 
+0

пожалуйста, покажите ожидаемый результат и помечать базы данных, которую вы используете. –

+0

Вы сократили имена столбцов для 'Question1' и' Question2' в вашем SQL? У вас есть счет 'Q1' и' Q2', которые не существуют в этом контексте. –

+0

Вы бы согласились «согласиться» с группой? – SqlZim

ответ

0

Вы можете сделать что-то подобное, чтобы получить счет за все варианты за вопрос.

SELECT s.Teacher, 
     q.Question, 
     COUNT(CASE WHEN val = 'Agree' THEN 1 END) AgreeCount, 
     COUNT(CASE WHEN val = 'Strongly Agree' THEN 1 END) StronglyAgreeCount, 
     COUNT(CASE WHEN val = 'Disagree' THEN 1 END) DisagreeCount, 
     COUNT(CASE WHEN val = 'Strongly Disagree' THEN 1 END) StronglyDisagreeCount 
FROM Survey s 
     CROSS APPLY (VALUES(s.Question1, 'Question1'),(s.Question2, 'Question2'),(s.Question3, 'Question3')) q(val,question) 
GROUP BY s.Teacher, q.Question 
ORDER BY s.Teacher, q.Question 

ouput: 
Teacher Question AgreeCount StronglyAgreeCount DisagreeCount StronglyDisagreeCount 
-------- --------- ----------- ------------------ ------------- --------------------- 
Jane Doe Question1 2   0     1    0 
Jane Doe Question2 3   0     0    0 
Jane Doe Question3 2   1     0    0 
John Doe Question1 1   0     1    0 
John Doe Question2 1   0     1    0 
John Doe Question3 1   0     0    1 
0

Ваши данные не нормированной (каждый ответ вопрос должен быть свой собственный ряд, а не столбец). Вам нужно будет как-то отключить данные, если вы хотите выполнять истинные реляционные запросы по данным.

Мы могли бы использовать явные UNPIVOT, но я думаю, что с помощью UNION проясняет, что происходит:

SELECT 
    Teacher, Period, 'Q1' AS Question, Question1 AS Response 
FROM 
    Survey 

UNION ALL 

SELECT 
    Teacher, Period, 'Q2' AS Question, Question2 AS Response 
FROM 
    Survey 

UNION ALL 

SELECT 
    Teacher, Period, 'Q3' AS Question, Question3 AS Response 
FROM 
    Survey 
  • Я использую UNION ALL для повышения производительности, как нам не нужен настоящий сет-союз результат (т.е. удаление дубликатов).
  • Повторите SELECT для каждой дополнительной колонки вопросов.

Это превратит ваши данные во что-то вроде этого:

Teacher  Period Question Response 
Jane Doe 1   Q1   Agree 
Jane Doe 1   Q2   Agree 
Jane Doe 1   Q3   Strongly Agree 
Jane Doe 2   Q1   Disagree 
Jane Doe 2   Q2   Agree 
Jane Doe 2   Q3   Agree 
... -- and so on 

Затем вы можете запустить реляционных запросов на этих данных:

Что мне нужно, чтобы иметь возможность вернуть счетчик от разных ответов Джейн Доу по Вопросу 1

Это делается так:

SELECT 
    Teacher, 
    COUNT(DISTINCT Response) AS DifferentAnswerCount 
FROM 
    /* inner query */ 
WHERE 
    Question = 'Q1' 
GROUP BY 
    Teacher 

Или, чтобы получить его по всем вопросам:

SELECT 
    Teacher, 
    Question, 
    COUNT(DISTINCT Response) AS DifferentAnswerCount 
FROM 
    /* inner query */ 
GROUP BY 
    Teacher, 
    Question 

Полный запрос:

SELECT 
    Teacher, 
    Question, 
    COUNT(DISTINCT Response) AS DifferentAnswerCount 
FROM 
    (
     SELECT 
      Teacher, Period, 'Q1' AS Question, Question1 AS Response 
     FROM 
      Survey 

     UNION ALL 

     SELECT 
      Teacher, Period, 'Q2' AS Question, Question2 AS Response 
     FROM 
      Survey 

     UNION ALL 

     SELECT 
      Teacher, Period, 'Q3' AS Question, Question3 AS Response 
     FROM 
      Survey 
    ) 
WHERE 
    Question = 'Q1' 
GROUP BY 
    Teacher, 
    Question 
0

Не уверен, что вы собираетесь в конечном выходе, но эта методика должна дать вам четкий путь к следующему и легко понятный вывод.

SELECT 
    Teacher 
    ,COUNT(CASE WHEN Q1 IN ('Agree','Strongly Agree') THEN 1 ELSE 0 END) AS 'Q1-Agree' 
    ,COUNT(CASE WHEN Q1 IN ('Disagree','Strongly Disagree') THEN 1 ELSE 0 END) AS 'Q1-Disagree' 
    ... 
FROM 
    input 
GROUP BY 
    Teacher 

Посредством этого вы создадите уникальную запись для каждого преподавателя, а затем можете определить группы для каждого выхода. Если вы просто хотите узнать, сколько раз они ответили на вопрос, вы можете использовать подсчеты, если хотите подсчитать условия.

0

Вы можете использовать apply() в UNPIVOT таблицу первого вместо цепочки union all. Настройка

тест: http://rextester.com/VGESS44812

create table t (
    Teacher varchar(32) 
    , Period int 
    , Question1 varchar(32) 
    , Question2 varchar(32) 
    , Question3 varchar(32) 
); 
insert into t (Teacher,Period,Question1,Question2,Question3) values 
('Jane Doe',1,'Agree','Agree','Strongly Agree') 
,('Jane Doe',2,'Disagree','Agree','Agree') 
,('John Doe',2,'Agree','Disagree','Agree') 
,('John Doe',4,'Disagree','Agree','Strongly Disagree') 
,('Jane Doe',3,'Agree','Agree','Agree') 
,('Zim',0,'<3','apply()',null); 

запрос:

select 
    Teacher 
    , Question 
    , Answer 
    , AnswerCount=count(*) 
    from t 
    outer apply (
     values (1,Question1),(2,Question2),(3,Question3) 
    ) as x (Question,Answer) 
    group by Teacher, Question, Answer 

выход:

+----------+----------+-------------------+-------------+ 
| Teacher | Question |  Answer  | AnswerCount | 
+----------+----------+-------------------+-------------+ 
| Jane Doe |  1 | Agree    |   2 | 
| Jane Doe |  1 | Disagree   |   1 | 
| Jane Doe |  2 | Agree    |   3 | 
| Jane Doe |  3 | Agree    |   2 | 
| Jane Doe |  3 | Strongly Agree |   1 | 
| John Doe |  1 | Agree    |   1 | 
| John Doe |  1 | Disagree   |   1 | 
| John Doe |  2 | Agree    |   1 | 
| John Doe |  2 | Disagree   |   1 | 
| John Doe |  3 | Agree    |   1 | 
| John Doe |  3 | Strongly Disagree |   1 | 
| Zim  |  1 | <3    |   1 | 
| Zim  |  2 | apply()   |   1 | 
| Zim  |  3 | NULL    |   1 | 
+----------+----------+-------------------+-------------+ 
+0

Вы все умнее, чем когда-либо в SQL-запросах. Спасибо за вашу помощь! –

0

Кажется, что один запрос, как это предлагается в некоторых из комментариев не будет вам что ты хочешь. Мое предложение было бы пойти на три отдельных запросов, как

select Teacher, Question1, count(*) cnt from tblx group by Teacher, Question1; 
select Teacher, Question2, count(*) cnt from tblx group by Teacher, Question2; 
select Teacher, Question3, count(*) cnt from tblx group by Teacher, Question3 

Смотрите здесь для рабочего примера: http://rextester.com/CTA10481