-1

私のテーブルには 5 つの列 (ID、UserId、Question and Answer、WebEnabled) があります。

「UserId」は FK であり、このテーブルは実際に多値属性の問題を解決します。

サンプルデータは次のとおりです。

Id  UserId  Question    Answer  WebEnabled
1   1   Q1              Ans1    1
2   1   Q2              Ans2    1
3   2   Q1              Ans1    1
4   2   Q4              Ans4    1
5   3   Q1              Ans1    1
6   3   Q3              Ans3    1
7   3   Q2              Ans2    0
8   4   Q5              Ans5    0

AND 演算子を使用して検索機能を実行する必要があります。

たとえば、ユーザーが Web ドロップダウンから Q1 と Q2 を入力すると、質問に Q1 と Q2 を持つすべての userId を返す必要があります。

助けてください。

編集:

Q1、Q2 は任意の数のパラメーター (Q1、Q2、Q3、Q4 など) にすることができ、クエリはそれらすべてを AND で使用し、UserID を返す必要があります。

4

3 に答える 3

1

PIVOT演算子を使用してデータにピボットを作成すると、Q1、Q2、Q3、... Q5が、ユーザーがその質問に回答するたびにそれぞれの下にカウントされる列として表示されます。次に、フィルターQ1およびQ2 = 1を使用して、ピボットセットからクエリを実行します。次の例をここで実行できます。http://sqlfiddle.com/# !3 / 6a31d / 8

WITH UserQuestionsPivot AS
(
SELECT
  UserId,
  Q1,Q2,Q3,Q4,Q5
FROM 
(
SELECT
  UserId,
  1 AS Answered,
  Question
FROM UserQuestions
) AS SourceTable
PIVOT
(
  SUM(Answered)
  FOR Question IN ([Q1], [Q2], [Q3], [Q4], [Q5])
) AS PivotTable
)
SELECT
  *
FROM UserQuestionsPivot
WHERE Q1 = 1 AND Q2 = 1
于 2012-12-12T04:29:31.723 に答える
1

あなたの質問がよくわかりません。以下のステートメントは、あなたが求めた答えを得るでしょうが、これはあなたが望んでいるものではないようです?

SELECT DISTINCT UserId
FROM   Table
WHERE  Question='Q1'
       OR
       Question='Q2'
于 2012-12-12T04:14:20.133 に答える
1

次のように、質問をコンマで区切って単一の文字列に結合し、値が繰り返されないようにします。

DECLARE @SearchString VARCHAR(100);
DECLARE @NumberOfValues INT;
Set @SearchString = 'Q1,Q2,Q3,Q4';
Set @NumberOfValues = 4;

次に、次の単純な SQL ステートメントを実行します。

SELECT Table1.* FROM 
Table1, (SELECT UserId, Count(DISTINCT Question) Cnt 
         From Table1 
         WHERE @SearchString LIKE '%' + RTRIM(Question) + '%' 
         GROUP BY UserID 
         HAVING Count(DISTINCT Question) = @NumberOfValues) AS T
WHERE Table1.UserId = T.UserId
于 2012-12-12T04:14:22.977 に答える