2012-05-20 493 views
0

我有一個調查,我需要爲它設計一個數據庫來存儲它的結果,並使用一些查詢檢索結果。如何獲得每個答案的回答者數量?

當前數據庫的設計,我已經是如下:

Respondents Table: RespondentID, Name, OrgCode 
Department Table: OrgCode, DepartmentName 
Category Table: CategoryID, CategoryName 
SubCategory Table: SubCategoryID, SubCategoryName, CategoryID 
Questions Table: QuestionID, QuestionDesc, CategoryID, SubCategoryID 
SubQuestions Table: SubQuestionID, SubQuestionDesc, QuestionID 
Answers Table: AnswerID, AnswerDesc, QuestionID, SubQuestionID 
CompleteSurvey Table: ID, RespondentID, CategoryID, AnswerID 

本次調查的一個例子:

Category I 
    SubCategory A 
    Question 1: what do you think about the following service 
     SubQuestion 1: Service #1 
      (Strongly Agree, Agree, Disagree, Strongly Disagree) 
     SubQuestion 2: Service #2 
      (Strongly Agree, Agree, Disagree, Strongly Disagree) 

讓我們假設有三個員工回答了這個問題

現在,我想編寫一個查詢,顯示說非常同意的受訪者人數,在每個問題或子問題中同意,不同意和強烈同意。 可以通過這個數據庫設計嗎?如果是的話,你能幫我解決這個問題嗎?

另外,你認爲還有其他設計比上述設計更簡單嗎?如果是的話,你可以請我推薦一個嗎?

數據庫設計:

/****** Object: Table [dbo].[Departments] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Departments](
    [OrgCode] [float] NOT NULL, 
    [DepartmentName] [nvarchar](max) NOT NULL, 
CONSTRAINT [PK_Departments] PRIMARY KEY CLUSTERED 
(
    [OrgCode] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Category] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Category](
    [CategoryID] [int] IDENTITY(1,1) NOT NULL, 
    [CategoryName] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[SubCategory] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[SubCategory](
    [SubCategoryID] [int] IDENTITY(1,1) NOT NULL, 
    [SubCategoryName] [nvarchar](50) NOT NULL, 
    [CategoryID] [int] NOT NULL, 
CONSTRAINT [PK_SubCategory] PRIMARY KEY CLUSTERED 
(
    [SubCategoryID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Respondents] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[Respondents](
    [RespondentID] [nvarchar](50) NOT NULL, 
    [Name] [varchar](50) NULL, 
    [OrgCode] [float] NOT NULL, 
CONSTRAINT [PK_Respondents] PRIMARY KEY CLUSTERED 
(
    [RespondentID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[Questions] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Questions](
    [QuestionID] [int] IDENTITY(1,1) NOT NULL, 
    [QuestionDesc] [nvarchar](max) NOT NULL, 
    [CategoryID] [int] NULL, 
    [SubCategoryID] [int] NULL, 
CONSTRAINT [PK_Questions] PRIMARY KEY CLUSTERED 
(
    [QuestionID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[CompleteSurvey] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[CompleteSurvey](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [RespondentID] [nvarchar](50) NOT NULL, 
    [CategoryID] [int] NOT NULL, 
    [AnswerID] [int] NOT NULL, 
CONSTRAINT [PK_CompleteSurvey] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[SubQuestions] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[SubQuestions](
    [SubQuestionID] [int] IDENTITY(1,1) NOT NULL, 
    [SubQuestionDesc] [nvarchar](max) NOT NULL, 
    [QuestionID] [int] NULL, 
CONSTRAINT [PK_SubQuestions] PRIMARY KEY CLUSTERED 
(
    [SubQuestionID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Answers] Script Date: 05/20/2012 07:26:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Answers](
    [AnswerID] [int] IDENTITY(1,1) NOT NULL, 
    [AnswerDesc] [nvarchar](max) NOT NULL, 
    [QuestionID] [int] NULL, 
    [SubQuestionID] [int] NULL, 
CONSTRAINT [PK_Answers] PRIMARY KEY CLUSTERED 
(
    [AnswerID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: ForeignKey [FK_SubCategory_Category] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[SubCategory] WITH CHECK ADD CONSTRAINT [FK_SubCategory_Category] FOREIGN KEY([CategoryID]) 
REFERENCES [dbo].[Category] ([CategoryID]) 
GO 
ALTER TABLE [dbo].[SubCategory] CHECK CONSTRAINT [FK_SubCategory_Category] 
GO 
/****** Object: ForeignKey [FK_Respondents_Departments] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[Respondents] WITH CHECK ADD CONSTRAINT [FK_Respondents_Departments] FOREIGN KEY([OrgCode]) 
REFERENCES [dbo].[Departments] ([OrgCode]) 
GO 
ALTER TABLE [dbo].[Respondents] CHECK CONSTRAINT [FK_Respondents_Departments] 
GO 
/****** Object: ForeignKey [FK_Questions_Category] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[Questions] WITH CHECK ADD CONSTRAINT [FK_Questions_Category] FOREIGN KEY([CategoryID]) 
REFERENCES [dbo].[Category] ([CategoryID]) 
GO 
ALTER TABLE [dbo].[Questions] CHECK CONSTRAINT [FK_Questions_Category] 
GO 
/****** Object: ForeignKey [FK_Questions_SubCategory] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[Questions] WITH CHECK ADD CONSTRAINT [FK_Questions_SubCategory] FOREIGN KEY([SubCategoryID]) 
REFERENCES [dbo].[SubCategory] ([SubCategoryID]) 
GO 
ALTER TABLE [dbo].[Questions] CHECK CONSTRAINT [FK_Questions_SubCategory] 
GO 
/****** Object: ForeignKey [FK_CompleteSurvey_Respondents] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[CompleteSurvey] WITH CHECK ADD CONSTRAINT [FK_CompleteSurvey_Respondents] FOREIGN KEY([RespondentID]) 
REFERENCES [dbo].[Respondents] ([RespondentID]) 
GO 
ALTER TABLE [dbo].[CompleteSurvey] CHECK CONSTRAINT [FK_CompleteSurvey_Respondents] 
GO 
/****** Object: ForeignKey [FK_SubQuestions_Questions] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[SubQuestions] WITH CHECK ADD CONSTRAINT [FK_SubQuestions_Questions] FOREIGN KEY([QuestionID]) 
REFERENCES [dbo].[Questions] ([QuestionID]) 
GO 
ALTER TABLE [dbo].[SubQuestions] CHECK CONSTRAINT [FK_SubQuestions_Questions] 
GO 
/****** Object: ForeignKey [FK_Answers_Questions] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[Answers] WITH CHECK ADD CONSTRAINT [FK_Answers_Questions] FOREIGN KEY([QuestionID]) 
REFERENCES [dbo].[Questions] ([QuestionID]) 
GO 
ALTER TABLE [dbo].[Answers] CHECK CONSTRAINT [FK_Answers_Questions] 
GO 
/****** Object: ForeignKey [FK_Answers_SubQuestions] Script Date: 05/20/2012 07:26:11 ******/ 
ALTER TABLE [dbo].[Answers] WITH CHECK ADD CONSTRAINT [FK_Answers_SubQuestions] FOREIGN KEY([SubQuestionID]) 
REFERENCES [dbo].[SubQuestions] ([SubQuestionID]) 
GO 
ALTER TABLE [dbo].[Answers] CHECK CONSTRAINT [FK_Answers_SubQuestions] 
GO 

回答

1

有兩種方式,人們通常做你想做的查詢類型。問題會非常簡單 - 只需使用COUNT聚合函數即可,但您可能想報告從未選擇的答案。聚合函數和外連接不能很好地協同工作。

獲得您要找的答案的第一種方法是使用Correlated Sub-Queries

第二種方法是使用Common Table Expressions(或CTE)。

相關的子查詢比較容易理解,但效率可能低於CTE。 CTE需要更長的時間學習,但他們可以解決簡單的舊SQL無法解決的問題。