2012-05-01 4 views
0

私はMS SQL 2008調査回答テーブルを持っており、いくつかのレポートを作成する必要があります。テーブルはかなり基本的なもので、自動番号キー、応答するユーザーのユーザーID、日付、個々の質問ごとのフィールドの束を持っています。ほとんどの質問は複数選択であり、応答フィールドのデータ値はその選択肢の短いvarcharテキスト表現です。SQLはレコードの個別の値をカウントしますが、いくつかのダンプをフィルタリングします

私がする必要があるのは、各選択肢のオプション(つまり、質問1の場合は10人、Aの場合は10人、Bの場合は20個など)ごとに異なる応答の数を数えることです。それはあまりにも複雑ではありません。しかし、その反面、一部の人が調査を複数回行ったため(同じユーザーIDフィールドを持つことになります)。これらの回答については、調査日のフィールドに基づいて最新のデータのみをレポートに含めることになっています。複数の記録を持つユーザーの古い調査記録を除外する最善の方法は何でしょうか?

+0

テーブル構造、サンプルデータ、希望の結果、お試しになる可能性のあるクエリを表示できますか?実際の仕様から作業することは、単語の問題から一からソリューションを作成するよりはるかに高速で簡単になるでしょう。 –

答えて

0

多分ない最も効率的なクエリが、何について:ユーザーID

によってmy_tableにグループから

選択し、ユーザーID、最大(survey_date)あなたは、内側には、追加のデータを取得するために、同じテーブルに参加することができます。

1

DBスキーマを私たちに教えてくれていないので、私はいくつかの仮定をしなければなりませんでしたが、row_numberを使用してユーザーが行った最新の調査を特定できるはずです。

with cte as 
    (
     SELECT 
       Row_number() over (partition by userID, surveyID order by id desc) rn, 
       surveyID 
      FROM 
       User_survey 
    ) 
SELECT 
     a.answer_type, 
     Count(a.anwer) answercount 
FROM 
     cte 
     INNER JOIN Answers a 
     ON cte.surveyID = a.surveyID 

WHERE 
     cte.rn = 1 
GROUP BY 
    a.answer_type 
関連する問題