私の会社のWebアプリケーションを開発しています。このアプリケーションは、ユーザーにクイズを提供します。今、私は経営陣にとって強力で有意義なダッシュボードを開発する必要があります。このSQLクエリを使用して各部門の完了率を示すために、各部門の従業員の総数を調べるにはどうすればよいですか?
従業員:私は、次のデータベースの設計を持っている:ダッシュボードには疑問があるショー%の参加=(各従業員が撮影したすべてのクイズの合計)/(従業員の総数はクイズの合計数を*)
を示さなければなりません表:ユーザー名、名前、職業、DivisionID
分割テーブル:DivisionID、DivisionName
クイズ表:QuizID、タイトル、説明
UserQuiz表:UserQuizID、スコア、DateTimeComplete、QuizID、ユーザー名
注:各テーブルの最初の属性はプライマリキーです。
完了率を表示するために私が使用しています(しかし、私はそれについては確認していない)SQLクエリは次のとおりです。
DECLARE @LastDayOfPrevMonth DATETIME, @FirstDayOfThreeMonthsBefore DATETIME
SET @FirstDayOfThreeMonthsBefore = DATEADD(MONTH, -2, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0))
SET @LastDayOfPrevMonth = GETDATE()
;WITH MonthCTE AS
(
SELECT DATENAME(MONTH, DATEADD(MONTH, -2, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, -2, CURRENT_TIMESTAMP)) AS MonthYear
UNION ALL
SELECT DATENAME(MONTH, DATEADD(MONTH, -1, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, -1, CURRENT_TIMESTAMP))
UNION ALL
SELECT DATENAME(MONTH, DATEADD(MONTH, 0, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, 0, CURRENT_TIMESTAMP))
)
SELECT Divisions.DivisionName
, [Percentage Participation] = CAST([Total Number of Quizzes Taken]
* 100.00/[Total Number of Quizzes] AS DECIMAL(18, 2))
, [Total Number of Quizzes Taken]
, [Total Number of Quizzes]
, [Total Number of Employees]
, MonthYear [Month]
, LEFT([MonthYear],3) + RIGHT([MonthYear], LEN([MonthYear]) - CHARINDEX('-',[MonthYear]) + 1) FirstThreeLettersOfMonth
FROM dbo.Divisions Divisions CROSS JOIN
(SELECT ISNULL(NULLIF(COUNT(*),0),1) [Total Number of Quizzes]FROM [dbo].[Quiz]) Quiz
OUTER APPLY (SELECT COUNT(*) AS [Total Number of Employees]
FROM [dbo].[employee]
WHERE employee.DivisionCode = Divisions.SapCode
) Employee
OUTER APPLY (
SELECT ISNULL([Total Number of Quizzes Taken],0) [Total Number of Quizzes Taken],
MonthCTE.MonthYear FROM
(SELECT COUNT(DISTINCT UserQuiz.QuizID) AS [Total Number of Quizzes Taken],
DATENAME(MONTH, UserQuiz.DateTimeComplete) + '-' + DATENAME(YEAR, UserQuiz.DateTimeComplete) MonthYear
FROM UserQuiz UserQuiz
INNER JOIN employee employee
ON UserQuiz.Username = employee.Username
WHERE employee.DivisionCode = Divisions.SapCode
AND UserQuiz.DateTimeComplete BETWEEN @FirstDayOfThreeMonthsBefore AND @LastDayOfPrevMonth
GROUP BY DATENAME(MONTH, UserQuiz.DateTimeComplete), DATENAME(YEAR, UserQuiz.DateTimeComplete)
)Quiz
RIGHT JOIN MonthCTE ON Quiz.MonthYear = MonthCTE.MonthYear
) QuizMonthOutput
私が今欲しいのは先月のための完了率を示していますのみ。
SELECT Divisions.DivisionShortcut
, [Percent Completion] = CAST([Sum of all Quizzes Taken by each Employee]
* 100.00/([Total Number of Employees]*[Total Number of Quizzes]) AS DECIMAL(18, 2))
それを行うには、どのように:
私は私の問題は今、ちょうど上記のクエリのこの部分にそれを追加するために、各部門の従業員の合計数を見つけることであると思いますか?
所望の出力のサンプル:
計算は次のようになります。これは上記のよう完了を計算しなければならないパーセントはに等しい(各従業員によって撮影された全てのクイズの合計)/(トータル従業員数*クイズ総数)。たとえば、Division Aに、Emp1とEmp2の2人の従業員がいる場合。毎月、4つのクイズがあります。 Emp1はクイズ#1とクイズ#2を、Emp2はクイズ#4を取った。完了率は=((Emp1 * 2 Quizzes)+(Emp2 * 1 Quiz))/(総従業員数*合計クイズ数)
完了率=(2 + 1)/ )2月8日= = 0.25
どうもありがとうございました。私は本当にあなたの助けに感謝します。あなたは私をたくさん助けました。しかし、私はDivisionIDではなくDivisionShortcut(ABやBCなど)を表示しているものが必要です。あなたのコードを修正しようとしましたが失敗しました。この問題で私を助けてくれますか? –
自分のコードにDivisionNameを追加しました。これを使ってDivisionShortcutを取得することができます。 – Wim
助けてくれてありがとうございますが、クエスチョンには各クイズのDISTINCTユーザー名を計算する必要があります。たとえば、Employee 'Andy'がQuiz#1を4回使用した場合、クエリは1つとして計算する必要があります。クエリは4つとして計算されます。あなたの質問を修正してください。私はそれを修正しようとしたが失敗した。 NrOfQuizesPerDivisionとして (SELECT COUNT(DISTINCT#1 UserQuiz.Username)AS –