2012-01-15 215 views
2

我正在開發一個comapny的web應用程序。此應用程序爲用戶提供測驗。現在,我需要爲管理層開發一個功能強大且有意義的儀表板。儀表板必須顯示許多統計信息。他們希望我以這樣的方式設計儀表盤:show%參與度=在部門級別每月進行的測驗次數除以總測驗次數並比較每個部門。如何在部門級別顯示月度參與率並比較每個部門?

的問題是:我有以下的數據庫設計:

Employee表:用戶名,姓名,工作,DivisionID

司表:DivisionID,DivisionName

測驗表:QuizID,標題,說明

UserQuiz Table:UserQuizID,Score,DateTimeComplete,QuizID,用戶名

注意:每個表中的第一個屬性是主鍵。

的SQL查詢我試圖使用顯示過去三個月的結果是:

SELECT COUNT(DISTINCT dbo.UserQuiz.QuizID) AS [Total Number of Quizzes], 
     dbo.Divisions.DivisionName, 
     DATENAME(Month, dbo.UserQuiz.DateTimeComplete) AS Month 
FROM dbo.UserQuiz INNER JOIN 
     dbo.Quiz ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID 
     INNER JOIN dbo.employee ON dbo.UserQuiz.Username = dbo.employee.Username 
     RIGHT OUTER JOIN dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode 
GROUP BY dbo.Divisions.DivisionName, 
    DATENAME(Month, dbo.UserQuiz.DateTimeComplete) 

另外,我嘗試了許多疑問,每次得到的東西從我想要的東西不同。坦率地說,我不知道如何達到上述要求。

編輯: 下面是一些數據的模式:

/****** Object: Table [dbo].[Divisions] Script Date: 01/15/2012 12:29:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[Divisions](
    [SapCode] [float] NOT NULL, 
    [DivisionShortcut] [varchar](10) NOT NULL, 
    [DivisionName] [varchar](max) NOT NULL, 
CONSTRAINT [PK_Divisions] PRIMARY KEY CLUSTERED 
(
    [SapCode] 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 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30003143, N'PMOD', N'AB') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30003144, N'ESD', N'BC') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30003153, N'PESD', N'CD') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30003158, N'SSD', N'DE') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30012601, N'PEOD', N'EF') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30021812, N'PEMD', N'FG') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30021876, N'BAG', N'GH 
') 
INSERT [dbo].[Divisions] ([SapCode], [DivisionShortcut], [DivisionName]) VALUES (30023176, N'EPM', N'HI') 
/****** Object: Table [dbo].[Quiz] Script Date: 01/15/2012 12:29:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[Quiz](
    [QuizID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [varchar](max) NOT NULL, 
    [IsSent] [bit] 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], [IsSent], [Description]) VALUES (11, N'Safety Quiz 1', 0, N'General Safety Quiz') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [IsSent], [Description]) VALUES (12, N'Safety Quiz 2', 0, N'General Safety Quiz') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [IsSent], [Description]) VALUES (13, N'Safety Quiz 3', 0, N'TEST') 
INSERT [dbo].[Quiz] ([QuizID], [Title], [IsSent], [Description]) VALUES (14, N'Safety Quiz 4', 0, N'TEST') 
SET IDENTITY_INSERT [dbo].[Quiz] OFF 
/****** Object: Table [dbo].[employee] Script Date: 01/15/2012 12:29:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[employee](
    [Name] [nvarchar](max) NOT NULL, 
    [Username] [nvarchar](255) NOT NULL, 
    [JobTitle] [nvarchar](max) NOT NULL, 
    [BadgeNo] [float] NOT NULL, 
    [EmpOrgType] [float] NOT NULL, 
    [DivisionCode] [float] NOT NULL, 
CONSTRAINT [PK_employee] PRIMARY KEY CLUSTERED 
(
    [Username] 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 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'John', N'AGUILEBS', N'Engineering Technician', 9545246, 2, 30012601) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'TED', N'ALKHATHI', N'Technical Clk Engrg', 8016951, 2, 30012601) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Bel', N'ALMARHMS', N'Business Sys Analyst Iv', 289589, 1, 30012601) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Tony', N'GRIGFW0A', N'Business Sys Analyst I', 9395990, 2, 30012601) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Maria', N'KHWAILAM', N'Asst Engineer Ii', 431177, 2, 30012601) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Johny', N'SALEMS0M', N'Business Sys Analyst Iii', 431163, 2, 30003143) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Teddy', N'TOWAAH0A', N'Business Sys Analyst Iv', 8819001, 2, 30003143) 
INSERT [dbo].[employee] ([Name], [Username], [JobTitle], [BadgeNo], [EmpOrgType], [DivisionCode]) VALUES (N'Arnold', N'VILLAV0A', N'Asst Engineer I', 329398, 1, 30023176) 
/****** Object: Table [dbo].[UserQuiz] Script Date: 01/15/2012 12:29:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[UserQuiz](
    [UserQuizID] [int] IDENTITY(1,1) NOT NULL, 
    [QuizID] [int] NOT NULL, 
    [DateTimeComplete] [smalldatetime] NOT NULL, 
    [Score] [float] NOT NULL, 
    [Username] [nvarchar](255) NOT NULL, 
CONSTRAINT [PK_UserQuiz] PRIMARY KEY CLUSTERED 
(
    [UserQuizID] 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 IDENTITY_INSERT [dbo].[UserQuiz] ON 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (21, 11, CAST(0x9FCD0345 AS SmallDateTime), 0, N'ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (81, 11, CAST(0x9FD50288 AS SmallDateTime), 0, N'ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (82, 11, CAST(0x9FC80000 AS SmallDateTime), 100, N'TOWAAH0A') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (83, 12, CAST(0x9FCE0000 AS SmallDateTime), 100, N'ALMARHMS') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (84, 11, CAST(0x9E790000 AS SmallDateTime), 50, N'VILLAV0A') 
INSERT [dbo].[UserQuiz] ([UserQuizID], [QuizID], [DateTimeComplete], [Score], [Username]) VALUES (85, 12, CAST(0x9FC20000 AS SmallDateTime), 100, N'ALMARHMS') 
SET IDENTITY_INSERT [dbo].[UserQuiz] OFF 
/****** Object: Default [DF_Quiz_IsSent] Script Date: 01/15/2012 12:29:48 ******/ 
ALTER TABLE [dbo].[Quiz] ADD CONSTRAINT [DF_Quiz_IsSent] DEFAULT ((0)) FOR [IsSent] 
GO 
/****** Object: ForeignKey [FK_employee_Divisions] Script Date: 01/15/2012 12:29:48 ******/ 
ALTER TABLE [dbo].[employee] WITH CHECK ADD CONSTRAINT [FK_employee_Divisions] FOREIGN KEY([DivisionCode]) 
REFERENCES [dbo].[Divisions] ([SapCode]) 
GO 
ALTER TABLE [dbo].[employee] CHECK CONSTRAINT [FK_employee_Divisions] 
GO 
/****** Object: ForeignKey [FK_UserQuiz_employee] Script Date: 01/15/2012 12:29:48 ******/ 
ALTER TABLE [dbo].[UserQuiz] WITH CHECK ADD CONSTRAINT [FK_UserQuiz_employee] FOREIGN KEY([Username]) 
REFERENCES [dbo].[employee] ([Username]) 
GO 
ALTER TABLE [dbo].[UserQuiz] CHECK CONSTRAINT [FK_UserQuiz_employee] 
GO 
/****** Object: ForeignKey [FK_UserQuiz_Quiz] Script Date: 01/15/2012 12:29:48 ******/ 
ALTER TABLE [dbo].[UserQuiz] WITH CHECK ADD CONSTRAINT [FK_UserQuiz_Quiz] FOREIGN KEY([QuizID]) 
REFERENCES [dbo].[Quiz] ([QuizID]) 
GO 
ALTER TABLE [dbo].[UserQuiz] CHECK CONSTRAINT [FK_UserQuiz_Quiz] 
GO 
+0

*「...%的參與=做部級按月通過測驗的總數除以測驗的數量......」 * - 一個費力的員工可能完成所有的測驗,結果爲100%參與了/她的部門。這是否與管理層期望看到的結果相一致?或者我錯過了什麼? – 2012-01-15 10:13:36

回答

1

試試這個:

SELECT 
    COUNT(DISTINCT dbo.employee.UserName) UserCount, 
    (SELECT COUNT(*) FROM dbo.Quiz) AS [Total Number of Quizzes], 
    (SELECT COUNT(*) FROM dbo.Quiz)*COUNT(DISTINCT dbo.employee.UserName) AS [Total Number of Quizzes for All users], 
    dbo.Divisions.DivisionName, 
    DATENAME(Month, dbo.UserQuiz.DateTimeComplete) AS MONTH, 
    COUNT(DISTINCT dbo.UserQuiz.QuizId)*COUNT(DISTINCT dbo.employee.UserName) AS [Completed This Month], 
    COUNT(DISTINCT dbo.UserQuiz.QuizId)*100/(SELECT COUNT(*) FROM dbo.Quiz) AS [Percent Completion] 
FROM dbo.employee 
JOIN dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode 
LEFT JOIN dbo.UserQuiz ON dbo.UserQuiz.Username = dbo.employee.Username 
WHERE dbo.UserQuiz.DateTimeComplete IS NOT NULL 
GROUP BY 
    dbo.Divisions.DivisionName, 
    DATENAME(Month, dbo.UserQuiz.DateTimeComplete) 

剛剛完成百分比爲僅在上個月各部門?

SELECT 
    dbo.Divisions.DivisionName, 
    DATENAME(Month, dbo.UserQuiz.DateTimeComplete) AS MONTH, 
    COUNT(DISTINCT dbo.UserQuiz.QuizId)*COUNT(DISTINCT dbo.employee.UserName)*100/((SELECT COUNT(*) FROM dbo.Quiz)*COUNT(DISTINCT dbo.employee.UserName)) AS [Percent Completion] 
FROM dbo.employee 
JOIN dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode 
LEFT JOIN dbo.UserQuiz ON dbo.UserQuiz.Username = dbo.employee.Username 
WHERE 
    dbo.UserQuiz.DateTimeComplete IS NOT NULL 
AND DATEPART(MONTH, dbo.UserQuiz.DateTimeComplete) = 12 
GROUP BY 
    dbo.Divisions.DivisionName, 
    DATENAME(Month, dbo.UserQuiz.DateTimeComplete) 
+0

顯然,COUNT(DISTINCT dbo.UserQuiz)'應該是別的。 – 2012-01-15 09:08:54

+0

@AndriyM好的,更正了。謝謝 – 2012-01-15 09:12:01

+0

謝謝。我非常感謝你的幫助。您的查詢很好,但它給了我奇怪的結果,我不知道爲什麼。請使用一些數據查看數據庫模式的一小部分。 – user1093651 2012-01-15 09:27:02

相關問題