2012-12-12 12 views
-1

我的表格有5列(ID,UserId,Question and Answer,WebEnabled)。如何在行上水平应用AND运算符?

“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运算做搜索功能。

例如,用户从网页下拉菜单中输入Q1和Q2将需要返回问题中具有Q1和Q2的所有userId。

请帮忙。

编辑:

Q1,Q2可以是任意数量的参数(比如Q1,Q2,Q3,Q4)和查询应使用所有这些与AND和返回用户名。

回答

1

我不太明白你的问题。以下声明将得到您所要求的答案,但看起来这可能不是您想要的?

SELECT DISTINCT UserId 
FROM Table 
WHERE Question='Q1' 
     OR 
     Question='Q2' 
+0

可以请你看看我的编辑 – user576510

+1

确定,其中是来自数据以及它是如何获得到SQL Server? –

+0

还有两个表。第一个问题定义,第二个问题可能的答案。这个表格选择了带有问题的答案。 – user576510

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

你能看到我的编辑吗?谢谢。 – user576510

+0

看到我更新的答案 – cha

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 
相关问题