2017-01-24 7 views
0

まずオフ結果そこから使用可能なデータを取得する必要があります。私はジェーンのQuestion1のために返却する必要がある。ここフォーマットは...は、私は答えを検索しようとしましたが、正直なところ、私はSQL Serverにインポートしたデータセットを持っているため...</p> <p>検索する内容を正確に把握していない

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のためのジェーンDoeの異なった答えの数を返すことができるようにすることです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

SQLで 'Question1'と' Question2'の列名を省略しましたか?この文脈には存在しない「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を使用すると、何が起こっていることが明らかに考える

私たちは真のセット組合を必要としないなどの性能を向上させるために UNION ALLを使用
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 
  • 結果(すなわち重複除去)。
  • 追加質問列ごとに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

あなたは最初の代わりに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 

のような3つの別々のクエリのために行くだろう作業例は、ここを参照してください:http://rextester.com/CTA10481

関連する問題

 関連する問題