2011-11-16 22 views
0

我正在開發一個簡單的Web應用程序,爲用戶提供測驗。由於我是ASP.NET新手,因此我正在按照如何在ASP.net網站上構建Quiz Engine Video系列。我的數據庫設計與這些視頻中使用的設計類似。 這是link of the first video: 一切都正常工作與我,但我現在想開發一個查詢,可以幫助我來顯示統計,顯示管理:系統中的測驗如何拿出顯示測驗總數,參與者總人數的統計數據?

  1. 總數

  2. 參加每次測驗總數

  3. 參加者總數一般在每天,每週,每月和每年的(如果可能)

爲了澄清最後一點,我想給管理員看到以下內容:

  1. 參與者心情大好,上週的總人數爲:......
  2. 採取的總數上週在測驗是:.........
  3. 在過去一個月中採取測驗的總人數爲:.........

我覺得這樣的事情是瞭解該系統的使用情況並向管理人員展示該系統在聯邦辦公室的效率如何非常有用。

數據庫的sechma:

CREATE TABLE [dbo].[Quiz](
    [QuizID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [varchar](max) NOT NULL, 
    [Description] [varchar](max) NULL, 
CONSTRAINT [PK_Quiz] PRIMARY KEY CLUSTERED 
(
    [QuizID] 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 
SET IDENTITY_INSERT [dbo].[Quiz] ON 
INSERT [dbo].[Quiz] ([QuizID], [Title], [Description]) VALUES (6, N'Safety', N'General Safety Test') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [Description]) VALUES (7, N'my title', N'my description') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [Description]) VALUES (9, N'General Safety Quiz2', N'Testing') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [Description]) VALUES (10, N'General Safety Quiz3', N'Testing #2') 
SET IDENTITY_INSERT [dbo].[Quiz] OFF 


/****** Object: Table [dbo].[Question] Script Date: 11/17/2011 00:44:38 ******/ 

CREATE TABLE [dbo].[Question](
    [QuestionID] [int] IDENTITY(1,1) NOT NULL, 
    [Question] [varchar](max) NOT NULL, 
    [Answer1] [varchar](max) NOT NULL, 
    [Answer2] [varchar](max) NOT NULL, 
    [Answer3] [varchar](max) NOT NULL, 
    [Answer4] [varchar](max) NOT NULL, 
    [CorrectAnswer] [tinyint] NOT NULL, 
    [AnswerExplanation] [varchar](max) NULL, 
    [QuestionOrder] [tinyint] NOT NULL, 
    [QuizID] [int] NOT NULL, 
CONSTRAINT [PK_Question] 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 
SET ANSI_PADDING OFF 
GO 
SET IDENTITY_INSERT [dbo].[Question] ON 
INSERT [dbo].[Question] ([QuestionID], [Question], [Answer1], [Answer2], [Answer3], [Answer4], [CorrectAnswer], [AnswerExplanation], [QuestionOrder], [QuizID]) VALUES (4, N'What is your name?', N'Mohammed ', N'Ali', N'Hassan', N'Husain', 1, N'My Name', 1, 6) 
INSERT [dbo].[Question] ([QuestionID], [Question], [Answer1], [Answer2], [Answer3], [Answer4], [CorrectAnswer], [AnswerExplanation], [QuestionOrder], [QuizID]) VALUES (7, N'What is the definition of Safety?', N'Being Safe', N'Being in danger', N'Be careful', N'be careless', 1, N'Nothing', 1, 9) 
INSERT [dbo].[Question] ([QuestionID], [Question], [Answer1], [Answer2], [Answer3], [Answer4], [CorrectAnswer], [AnswerExplanation], [QuestionOrder], [QuizID]) VALUES (8, N'What is the definition of Safety? ', N'Being Safe', N'Being Careless', N'Being Careful', N'Being in Dangerous', 1, N'Nothing to say', 1, 10) 
SET IDENTITY_INSERT [dbo].[Question] OFF 
/****** Object: Table [dbo].[UserQuiz] Script Date: 11/17/2011 00:44:38 ******/ 
CREATE TABLE [dbo].[UserQuiz](
    [UserQuizID] [int] NULL, 
    [QuizID] [int] NOT NULL, 
    [DateTimeComplete] [smalldatetime] NOT NULL, 
    [Score] [tinyint] NOT NULL, 
    [Username] [nvarchar](256) NOT NULL 
) ON [PRIMARY] 
GO 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (NULL, 6, CAST(0x9F8F02D8 AS SmallDateTime), 100, N'SMP\ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (NULL, 6, CAST(0x9F8F02E3 AS SmallDateTime), 50, N'SMP\ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (NULL, 6, CAST(0x9F8F0333 AS SmallDateTime), 50, N'SMP\ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (NULL, 7, CAST(0x9F8F0335 AS SmallDateTime), 100, N'SMP\ALMARHMS') 

通過從這裏在這個偉大的社區裏的朋友的幫助下,我想出了一個查詢,顯示參加每次測驗的次數。這是查詢:

SELECT  Q.QuizID, Q.Title, COUNT(*) AS Users 
            FROM  dbo.UserQuiz AS UQ 
            INNER JOIN dbo.Quiz AS Q ON Q.QuizID = UQ.QuizID 
            GROUP BY Q.QuizID, Q.Title 

現在我需要修改它或與新的查詢,讓我以上三點。我怎樣才能做到這一點?

回答

1

如果要算上過去7天,過去30天,你可以使用這樣的事情:

-- Count of Participants in the last 7 days 
SELECT COUNT(DISTINCT Q.UserName) 
FROM dbo.UserQuiz Q 
WHERE DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

-- Count quizzes taken in the last 7 days 
SELECT COUNT(Q.QuizID) 
FROM dbo.UserQuiz Q 
WHERE Q.DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

-- Count quizzes taken in the last 30 days 
SELECT COUNT(Q.QuizID) 
FROM dbo.UserQuiz Q 
WHERE Q.DateTimeComplete >= DATEADD(dd, -30, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

需要注意的是,如果你想然後再以數日曆星期和日曆月,你需要做更多的工作來過濾正確的開始和結束日期過濾器。


編輯:固定的查詢語法(第1個答案不公佈SSMS中運行它)也是我一開始沒有注意到UserQuiz.UserQuizID爲空。因此,這一欄並不是我期望的那樣。


EDIT#2:作爲每OP的請求,這三個統計也可在單個查詢中使用子選擇檢索。子選擇是必要的,因爲過濾標準或計算每個統計量(或兩者)所涉及的聚合的差異。

-- Combine three stats into one query using sub-selects... 
SELECT 
(SELECT COUNT(DISTINCT Q.UserName) 
FROM dbo.UserQuiz Q 
WHERE DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))) 
as ParticipantsLast7Days, 
(SELECT COUNT(Q.QuizID) 
FROM dbo.UserQuiz Q 
WHERE Q.DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))) 
as QuizzesLast7Days, 
(SELECT COUNT(Q.QuizID) 
FROM dbo.UserQuiz Q 
WHERE Q.DateTimeComplete >= DATEADD(dd, -30, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))) 
as QuizzesLast30Days 
+0

感謝您的幫助。對此,我真的非常感激。然而,我試過了你的疑問,但是他們中沒有人和我一起工作。對不起,但不要誤解我的意思。我對Web開發仍然陌生。例如,我在SQLServer Management Studio中嘗試了您的第一個查詢,並且出現以下錯誤:Msg 156,Level 15,State 1,Line 3 關鍵字'SELECT'附近的語法錯誤。 Msg 102,Level 15,State 1,Line 3 ')'附近語法不正確。 –

+0

@ MohammedAl-Ali - 對不起,我最初的回答沒有在SSMS中進行測試的好處。我已經修復了錯誤。語法現在是正確的。 –

+0

這是可以的。我可以修復語法。現在,我只是擔心結果,因爲所有查詢都得到了0。我不知道爲什麼。我正在研究解決問題。我有數據庫中的數據,但仍然有零。你能幫我解決這個問題嗎? –