2

セッションと質問の数値フィールドを持つテーブルがあります。各セッションには、質問 1、2、および 3 があります。1 は「努力」、2 は「満足」、3 は「知識」です。「非常に満足」、「非常に満足」、「やや満足」、「不満」、「非常に不満」の5つの選択肢があります。

テーブルは次のようになります。

Session  Question  Answer
-------  --------  ------------------
1        1         Unsatisfied
1        2         Very Satisfied
1        3         Somewhat Satisfied

レポートを次のようにしたい:

Session  Effort          Knowledge       Satisfaction
-------  --------------  --------------  --------------
1        Unsatisfied     Unsatisfied     Very Satisfied
2        Very Satisfied  Very Satisfied  Very Satisfied

ただし、case ステートメントを使用すると、次のようになります。

Session  Question  Effort       Knowledge       Satisfaction
-------  --------  -----------  --------------  ------------
1        1         Unsatisfied  NULL            NULL
1        2         NULL         Very Satisfied  NULL
1        3         NULL         NULL            Unsatisfied

私が使用しているクエリは次のとおりです。

select 
    distinct session
    ,Question
    ,case
      when Question = '1' 
      then Answer
            end as "Effort"
,case
      when Question = '3' 
      then Answer
            end as "Knowledge"
,case
      when Question ='2' 
      then Answer
            end as "Satisfaction"
from Survey_Table

データをセッションごとに単一の行として返す方法についてのアイデアはありますか?

4

3 に答える 3

4

CASEステートメントに集計を適用するこれを試してください:

select session
   ,max(case when Question = '1' then Answer end) as Effort
   ,max(case when Question = '3' then Answer end) as Knowledge
   ,max(case when Question ='2' then Answer end) as Satisfaction
from Survey_Table
Group by session

または、PIVOT 関数を使用できます。

 Select session,
     [1] as effort,
     [2] as satisfaction,
     [3] as knowledge
 From
 (
       Select session, question, answer
       From survey_table
  ) src
  Pivot
  ( 
      Max(answer)
      For question in ([1], [2], [3])
  ) piv
于 2012-12-28T22:16:21.737 に答える
0

注意:bluefeetの答えはすでにこの基本的な方法をカバーしています。を構造化する別の方法を指摘したかっただけPIVOTです。列の値をタイトルに関連付けるための独自のテーブルが本当に必要ですが、そのようなテーブルがない場合は、質問の値を明示的な列のエイリアスで対応するタイトルにQuestionリンクするのではなく、この情報を派生テーブルとして個人的にエンコードします。[1], [2], [3]

SELECT
   P.*
FROM
   (
      SELECT T.SessionID, Q.Title, T.Answer
      FROM
         dbo.SurveyTable T
         INNER JOIN (
            SELECT 1, 'Effort'
            UNION ALL SELECT 2, 'Knowledge'
            UNION ALL SELECT 3, 'Satisfaction'
         ) Q (Question, Title)
            ON T.Question = Q.Question
   ) S
   PIVOT (Max(Q.Answer) FOR Q.Title IN (Effort, Knowledge, Satisfaction)) P

これは、MS SQLServer2005以降で機能します。

于 2012-12-28T22:38:54.573 に答える
0

また:

max と partition by を組み合わせて、group by の必要性をなくすことができます。例えば

max(case when xxx ='123' then yyy end) OVER(PARTITION BY a,b,c) AS Test1
于 2014-03-24T13:21:42.807 に答える