2017-01-24 1 views
0

Zunächst einmal zu analysieren, habe ich nach einer Antwort zu suchen versucht, aber ehrlich gesagt nicht genau wissen, was für ...SQL Query Ergebnisse der Umfrage

ich einen Datensatz zu suchen haben ich in SQL Server importiert haben und müssen brauchbare Daten daraus erhalten. Hier das Format ...

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 

und so weiter ... Was ich brauche, ist in der Lage eine Anzahl von Jane Doe verschiedenen Antworten für Question1 zurückzukehren, Question2 usw. Ich brauche für Janes Question1 zurückzukehren Es gibt 2 Übereinstimmungen und 1 Nicht zustimmen. Ich brauche das für mehrere Lehrer.

Ich habe versucht, mit GROUP BY, aber ich muss nicht etwas richtig machen. Ich habe versucht, Variationen:

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

Vielen Dank für Ihre Hilfe!

EDIT

Also, das ist die Frage, die ich am Ende immer, was ich brauchte. Meine Daten sollten nicht freigegeben werden. Ich glaube, das wird viel einfacher. Dies ist die Frage, die mich bekam, was ich gesucht habe ...

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

bitte die erwartete Ausgabe zeigen und markieren Sie die Datenbank verwenden. –

+0

Haben Sie die Spaltennamen für 'Question1' und' Question2' in Ihrem SQL abgekürzt? Sie haben es "Q1" und "Q2" zu zählen, die in diesem Zusammenhang nicht existieren. –

+0

Würden Sie "stimme stark zu" mit "stimme zu" übereinstimmen? – SqlZim

Antwort

0

Sie könnten so etwas tun, um für alle Optionen pro Frage zu zählen.

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

Ihre Daten nicht normiert ist (jede Frage Antwort sollte eine eigene Zeile, keine Spalte sein). Sie müssen die Daten irgendwie deaktivieren, wenn Sie echte relationale Abfragen für die Daten durchführen möchten.

Wir konnten eine explizite UNPIVOT benutzen, aber ich denke, mit einem UNION macht deutlich, was los ist:

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 
  • Ich benutze eine UNION ALL Leistung zu verbessern, wie wir Verschraubungssatz-nicht ein den tatsächlichen brauchen Ergebnis (dh doppelte Entfernung).
  • Wiederholen Sie die SELECT für jede zusätzliche Frage Spalte.

Dies wird Ihre Daten in so etwas wie diese Transformation:

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 

Dann sind Sie relationale Abfragen dieser Daten ausführen können:

Was ich brauche, ist in der Lage sein, eine Zählung zurück von Jane Doe verschiedene Antworten für Frage 1

Dies ist so gemacht:

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

Oder es für alle Fragen zu bekommen:

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

Die vollständige Abfrage:

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

Nicht sicher, was Sie in der endgültigen Ausgabe gehen, aber diese Methode sollte Ihnen ein klarer Weg und ein leicht verständlicher Ausgang.

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 

Dadurch erstellen Sie einen eindeutigen Datensatz für jeden Lehrer und können dann Gruppen für jede Ausgabe definieren. Wenn Sie nur wissen möchten, wie oft sie die Frage beantwortet haben, können Sie Zählungen verwenden, wenn Sie die Bedingungen zählen möchten.

0

können Sie apply() benutzen, um Ihre Tabelle von Verkettungs union all ersten stattdessen UNPIVOT.

Testaufbau: 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); 

query:

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 

Ausgang:

+----------+----------+-------------------+-------------+ 
| 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

Sie sind alle schlauer als ich jemals bei SQL-Abfragen sein werde. Danke Ihnen allen für Ihre Hilfe! –

0

Es scheint, dass eine einzelne Abfrage, wie in einigen der Kommentare vorgeschlagen werden Sie nicht bekommen was du willst. Mein Vorschlag wäre für drei separate Anfragen wie

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 

gehen hier finden Sie für ein Arbeitsbeispiel: http://rextester.com/CTA10481