如何在行上水平应用AND运算符?

时间:2012-12-12 04:09:12

标签: sql sql-server sql-server-2008 tsql

我的表有5列(ID,UserId,问答,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运算符执行搜索功能。

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

请帮助。

修改

Q1,Q2可以是任意数量的参数(比如Q1,Q2,Q3,Q4),查询应该使用AND并返回UserID。

3 个答案:

答案 0 :(得分:1)

我不太明白你的问题。下面的陈述将得到你所要求的答案,但似乎这可能不是你想要的?

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

答案 1 :(得分: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

答案 2 :(得分: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