选择具有条件的SQL以计算不同的值

时间:2015-08-05 13:21:37

标签: sql-server

我试图对SQL进行查询但是我被卡住了!

我有两张桌子:
表1:问题
表2:答案

对于每个问题,我可以有来自不同用户的一个或多个答案,但每个用户可以评论一次 当用户回答问题时,他必须为答案选择一种状态:
1)同意, 2)不同意或 3)讨论

所以,"问题" table有这样的所有问题:

Id  Question
1   q1
2   q2
3   q3

..和"答案" table包含来自用户的所有答案,以及" Question"中的FK。表和具有用户选择状态的列。

Id  Answer  IdQuestion   Status
1   a1      1            1
2   a2      1            3
3   a3      2            2
4   a4      2            2
5   a5      3            1  

我需要什么:我需要选择所有问题而且我需要计算所有具有不同aswer状态的问题。

示例:
问题1有两个答案,两个答案具有不同的状态。我需要计算或输入一个数字才能知道这个问题的答案具有不同的状态。

问题2有两个答案,但所有答案都具有相同的状态。我不需要计算......或者可能会将其他数字与具有不同状态答案的问题区分开来。

只有一个答案的问题我只是正常选择。

3 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但听起来好像是在Status表中的Answers计数之后。因此,基于一个问题(无论答案如何),您需要计算每个问题存在多少个不同的状态值:

CREATE TABLE #Question
    (
      [Id] INT ,
      [Question] VARCHAR(2)
    );

INSERT  INTO #Question
        ( Id, Question )
VALUES  ( 1, 'q1' ),
        ( 2, 'q2' ),
        ( 3, 'q3' ),
        ( 4, 'q4' )

CREATE TABLE #Answer
    (
      [Id] INT ,
      [Answer] VARCHAR(2) ,
      [IdQuestion] INT ,
      [Status] INT
    );

INSERT  INTO #Answer
        ( [Id], [Answer], [IdQuestion], [Status] )
VALUES  ( 1, 'a1', 1, 1 ),
        ( 2, 'a2', 1, 3 ),
        ( 3, 'a3', 2, 2 ),
        ( 4, 'a4', 2, 2 ),
        ( 5, 'a5', 3, 1 );

SELECT  q.id  ,
        COUNT(DISTINCT Status) DistinctStatusCount
FROM  #Question   q
LEFT JOIN #Answer a ON q.Id = a.IdQuestion
GROUP BY q.Id

DROP TABLE #Answer
DROP TABLE #Question

<强>输出

IdQuestion  DistinctStatusCount
1           2
2           1
3           1
4           0

如果您只对至少有一个答案的问题感兴趣,可以直接参考Answers表:

SELECT  IdQuestion ,
        COUNT(DISTINCT Status) DistinctStatusCount
FROM    #Answer
GROUP BY IdQuestion

答案 1 :(得分:0)

我必须遗漏一些内容,因为这看起来很简单......我加入联盟的唯一原因是一个问题可能没有任何答案,你要求退回所有问题。否则,这可能只是答案表上的查询。

SELECT Q.id, count(Distinct A.status)
FROM Question Q
LEFT JOIN Answer A
 on Q.ID = A.IdQuestion
Group by Q.IdQuestion

答案 2 :(得分:0)

试试这个:

select q.id, 
       question, 
       case when min(status) <> max(status) then 
          1 
       else 
          0 
       end as hasDifferentStatuses
from questions q
inner join answers a on(q.id = a.IdQuestion)
group by q.id, question