2014-10-17 284 views
1

我正在嘗試計算問卷系統的響應。我想在一個表格中顯示結果(問題,選項,回覆數量)。我寫了一個可以正常工作的查詢,但沒有顯示所有的選項,也沒有顯示任何響應。SQL表連接查詢

我查詢

SELECT  R.QuestionID, Q.QuestionName, A.OptionName, COUNT(R.OptionID) AS Responses, A.OptionID 
FROM   Response AS R 
INNER JOIN 
        Question AS Q ON Q.QuestionID = R.QuestionID 
INNER JOIN 
        Option AS A ON R.OptionID = A.OptionID 
WHERE  (R.QuestionnaireID = 122) 
GROUP BY R.QuestionID, Q.QuestionName, A.OptionName, R.OptionID, A.OptionID 

數據庫結構

  • 問卷(questionnaireID PK,questionnaireName)
  • 問題(questionID PK,questionnaireID FK,questionnaireName)
  • 選項(OptionID PK,questionID FK,optionName)
  • 響應(ResponseID PK,questionnaireID FK,questionID FK,值)

表定義

CREATE TABLE [dbo].[Questionnaire] (
    [QuestionnaireID]   INT IDENTITY (1, 1) NOT NULL, 
    [QuestionnaireName]  NVARCHAR (100) NOT NULL, 
    PRIMARY KEY CLUSTERED ([QuestionnaireID] ASC), 
); 
CREATE TABLE [dbo].[Question] (
    [QuestionID]   INT IDENTITY (1, 1) NOT NULL, 
    [QuestionnaireID]  INT    NOT NULL, 
    [QuestionName]  NVARCHAR (250) NOT NULL, 
    PRIMARY KEY CLUSTERED ([QuestionID] ASC), 
    CONSTRAINT [FK_Question_Questionnaire] FOREIGN KEY ([QuestionnaireID]) REFERENCES [dbo].[Questionnaire] ([QuestionnaireID]) 
); 
CREATE TABLE [dbo].[Option] (
    [OptionID] INT    IDENTITY (1, 1) NOT NULL, 
    [QuestionID] INT    NOT NULL, 
    [OptionName] NVARCHAR (150) NOT NULL, 
    PRIMARY KEY CLUSTERED ([OptionID] ASC), 
    CONSTRAINT [FK_Option_Question] FOREIGN KEY ([QuestionID]) REFERENCES [dbo].[Question] ([QuestionID]) 
); 
CREATE TABLE [dbo].[Response] (
    [ResponseID]  INT    IDENTITY (1, 1) NOT NULL, 
    [QuestionnaireID] INT    NOT NULL, 
    [QuestionID]  INT    NOT NULL, 
    [Val]    NVARCHAR (150) NOT NULL, 
    [OptionID]  INT    NULL, 
    PRIMARY KEY CLUSTERED ([ResponseID] ASC), 
    CONSTRAINT [FK_Response_Option] FOREIGN KEY ([OptionID]) REFERENCES [dbo].[Option] ([OptionID]), 
    CONSTRAINT [FK_Response_Question] FOREIGN KEY ([QuestionID]) REFERENCES [dbo].[Question] ([QuestionID]), 
    CONSTRAINT [FK_Response_Questionnaire] FOREIGN KEY ([QuestionnaireID]) REFERENCES [dbo].[Questionnaire] ([QuestionnaireID]) 
); 

當前數據:

insert into questionnaire values ('ASP.NET questionnaire'); 
insert into questionnaire values('TEST questionnaire'); 

insert into question values (2, 'rate our services'); 
insert into question values (2, 'On scale from 1 to 5, how much youre sleepy?'); 
insert into question values (2, 'how are you today'); 

insert into [Option] values (1, 'good'); 
insert into [Option] values (1, 'bad'); 
insert into [Option] values (1, 'medium'); 

insert into [Option] values(2, '1'); 
insert into [Option] values(2, '2'); 
insert into [Option] values(2, '3'); 
insert into [Option] values(2, '4'); 
insert into [Option] values(2, '5'); 

insert into [option] values (3, 'fine'); 
insert into [option] values (3, 'great'); 
insert into [option] values (3, 'not bad'); 
insert into [option] values (3, 'bad'); 

insert into response values(2, 1, 'good', 1); 
insert into response values(2, 1, 'good', 1); 
insert into response values(2, 1, 'bad', 2); 
insert into response values(2, 1, 'good', 1); 

insert into response values(2, 2, '1', 4); 
insert into response values(2, 2, '3', 3); 
insert into response values(2, 2, '4', 5); 
insert into response values(2, 2, '5', 8); 

希望的輸出

Output

SQL小提琴

Sql Fiddle

+1

你能分享一些樣本數據和你試圖達到的結果嗎?我不確定我在追隨。 – Mureinik 2014-10-17 14:31:03

+0

我已更新該問題。 – ElSS 2014-10-17 14:44:12

+0

請根據樣本數據共享三個表格中的樣本數據和所需的結果。 – Ram 2014-10-17 16:31:55

回答

1

您需要使用LEFT JOIN,如果你想display all the options and if there are no responses for them

編輯

我已經更新了基於你的SQL小提琴的答案。它在SQL Fiddle工作,並給你你想要的輸出。

SELECT  Q.QuestionName AS Question, 
      A.OptionName AS [Option], 
      COUNT(R.OptionID) AS Responses 
FROM   Question AS Q 
INNER JOIN 
     [Option] AS A ON A.questionID = Q.questionID 
LEFT JOIN 
    Response AS R ON Q.QuestionID = R.QuestionID AND R.OptionId=A.Optionid 

WHERE  (Q.QuestionnaireID = 2) 
GROUP BY Q.QuestionID, Q.QuestionName, A.OptionName 
ORDER BY Q.QuestionName,A.OptionName 
+0

它返回與我的查詢相同的結果。 – ElSS 2014-10-17 16:20:53

+0

你現在可以試試嗎? – Ram 2014-10-17 19:20:32

+0

由於某種原因,它給出了值爲1的零選項。我玩過它,但仍然......沒有迴應時它不顯示空。 – ElSS 2014-10-17 20:37:11

0

試試這個:

select 
    R.QuestionID, isnull(Q.QuestionName, ''), isnull(A.OptionName, ''), 
    sum(case when A.OptionID is not null then 1 else 0 end) ResponsesCount 
from Response R 
left join Question Q on 
    R.QuestionID = Q.QuestionID 
left join [Option] A on 
    R.OptionID = A.OptionID 
where 
    R.QuestionnaireID = 122 
group by 
    R.QuestionID, isnull(Q.QuestionName, ''), 
    isnull(A.OptionName, ''), R.OptionID 

在這裏,你看,我更換內連接至左連接考慮到沒有迴應選項。
此外,我改變了count邏輯 - 我們只需要計數非空ID(所以我在sum中使用case語句)。最後,我將所有'可能是空列'(從左連接的表格)包裝到isnull函數中。

+0

它返回與我的查詢相同的結果。 – ElSS 2014-10-17 16:22:18