【问题标题】:How to come up with statistics that shows the total number of quizzes, total number of participants?如何得出显示测验总数、参与者总数的统计数据?
【发布时间】:2011-11-16 10:14:18
【问题描述】:

我正在开发一个简单的 Web 应用程序,为用户提供测验。因为我是 ASP.NET 世界的新手,所以我正在关注 ASP.net 网站上的如何构建测验引擎视频系列。我的数据库设计与这些视频中使用的设计相似。 这是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

现在我需要修改它或者想出一个新的查询来给我以上三点。我该怎么做?

【问题讨论】:

    标签: asp.net sql-server


    【解决方案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)) 
    

    请注意,如果您想计算日历周和日历月,那么您需要做更多的工作来过滤正确的开始和结束日期过滤器。


    编辑: 修复了查询语法(未在 SSMS 中运行的情况下发布的第一个答案),起初我也没有注意到 UserQuiz.UserQuizID 可以为空。因此,本专栏不是我所期望的。


    编辑#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
    

    【讨论】:

    • 感谢您的帮助。对此,我真的非常感激。但是,我尝试了您的查询,但没有一个与我合作。对不起,但不要误会我的意思。我还是 Web 开发的新手。例如,我在 SQLServer Management Studio 中尝试了您的第一个查询,我收到以下错误:Msg 156, Level 15, State 1, Line 3 关键字“SELECT”附近的语法不正确。消息 102,级别 15,状态 1,第 3 行 ')' 附近的语法不正确。
    • @MohammedAl-Ali - 抱歉,我最初的回答是在没有 SSMS 测试的情况下完成的。我已经修复了错误。现在语法是正确的。
    • 没关系。我可以修复语法。现在,我只是担心结果,因为所有查询的结果都是 0。我不知道为什么。我正在努力找出问题所在。我在数据库中有数据,但我仍然得到零。你能帮我解决这个问题吗?
    • 查看样本数据中的日期。他们都太老了。您需要运行更新以修改示例数据中的日期或更改要返回的天数。
    • 是的,你是对的。很抱歉错过了这个东西。顺便说一句,是否可以将所有这些查询放在一个查询中?如何?很抱歉问得太多了,但这种查询对我来说是新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2019-04-17
    相关资源
    最近更新 更多