2012-03-04 3 views
-1

私の会社の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

答えて

1

はこれを試してみてください:

DROP TABLE #Employee 
DROP TABLE #Division 
DROP TABLE #Quiz 
DROP TABLE #UserQuiz 

CREATE TABLE #Employee(
    Username CHAR(10), 
    Name VARCHAR(20), 
    Job  VARCHAR(20), 
    DivisionID INT 
) 
INSERT INTO #Employee(Username, Name, Job, DivisionID) VALUES 
('Me', 'Me', 'job1', 1), 
('Myself', 'Myself', 'job2', 1), 
('Andy', 'Andy', 'job3', 1), 
('Ai', 'Ai', 'job4', 2) 

CREATE TABLE #Division(
    DivisionID INT, 
    DivisionName VARCHAR(20) 
) 
INSERT INTO #Division(DivisionID, DivisionName) VALUES 
(1, 'Div1'), 
(2, 'Div2') 

CREATE TABLE #Quiz(
    QuizID INT, 
    Title VARCHAR(20), 
    Description VARCHAR(20) 
) 
INSERT INTO #Quiz(QuizID, Title, Description) VALUES 
(1, 'Quiz1', 'Quiz1'), 
(2, 'Quiz2', 'Quiz2'), 
(3, 'Quiz3', 'Quiz3'), 
(4, 'Quiz4', 'Quiz4'), 
(5, 'Quiz5', 'Quiz5'), 
(6, 'Quiz6', 'Quiz6'), 
(7, 'Quiz7', 'Quiz7'), 
(8, 'Quiz8', 'Quiz8') 

CREATE TABLE #UserQuiz(
    UserQuizID INT, 
    Score INT, 
    DateTimeComplete DATETIME, 
    QuizID INT, 
    Username CHAR(10), 
) 
INSERT INTO #UserQuiz(UserQuizID, Score, DateTimeComplete, QuizID, Username) VALUES 
(1, 10, '20000101', 1, 'Me'), 
(2, 0, '20000101', 1, 'Myself'), 
(3, 10, '20120210', 5, 'Me'), 
(4, 10, '20120210', 6, 'Myself'), 
(5, 10, '20120210', 7, 'Andy'), 
(6, 10, '20120101', 5, 'Ai') 

DECLARE @LastDayOfPrevMonth DATETIME, @FirstDayOfPrevMonth DATETIME 

SET @FirstDayOfPrevMonth = DATEADD(dd, -DAY(DATEADD(mm, 1, GetDate()) - 1), DATEADD(mm, -1, GetDate())) 
SET @LastDayOfPrevMonth = DATEADD(dd, -DAY(DATEADD(m, 1, GetDate())), DATEADD(m, 0, GetDate())) 

;WITH LastMontQuizes AS 
(SELECT distinct QuizID 
FROM #UserQuiz 
WHERE DateTimeComplete BETWEEN @FirstDayOfPrevMonth AND @LastDayOfPrevMonth 
), 
NumberOfQuizes AS 
(SELECT COUNT(*) as NumberOfQuizes 
FROM LastMontQuizes 
), 
NrOfQuizesPerDivision AS 
(SELECT COUNT(*) as NrOfQuizesPerDivision, #Division.DivisionID 
FROM #Division 
    INNER JOIN #Employee ON 
    #Division.DivisionID = #Employee.DivisionID 
    INNER JOIN #UserQuiz ON 
    #Employee.Username = #UserQuiz.Username 
    INNER JOIN LastMontQuizes ON 
    #UserQuiz.QuizID = LastMontQuizes.QuizID 
GROUP BY #Division.DivisionID 
), 
NrOfEmployeesPerDivision AS 
(SELECT COUNT(*) as NrOfEmployeesPerDivision, #Division.DivisionID 
FROM #Division 
    INNER JOIN #Employee ON 
    #Division.DivisionID = #Employee.DivisionID 
GROUP BY #Division.DivisionID 
) 
SELECT #Division.DivisionName, 
    NrOfQuizesPerDivision.DivisionID, 
    NrOfQuizesPerDivision.NrOfQuizesPerDivision * 100.0/(NrOfEmployeesPerDivision.NrOfEmployeesPerDivision + NumberOfQuizes.NumberOfQuizes) AS Percentage, 
    NrOfQuizesPerDivision.NrOfQuizesPerDivision, 
    NrOfEmployeesPerDivision.NrOfEmployeesPerDivision, 
    NumberOfQuizes.NumberOfQuizes 
FROM NrOfQuizesPerDivision 
    INNER JOIN NrOfEmployeesPerDivision ON 
    NrOfQuizesPerDivision.DivisionID = NrOfEmployeesPerDivision.DivisionID 
    INNER JOIN #Division ON 
    NrOfQuizesPerDivision.DivisionID = #Division.DivisionID 
    CROSS JOIN NumberOfQuizes 
+0

どうもありがとうございました。私は本当にあなたの助けに感謝します。あなたは私をたくさん助けました。しかし、私はDivisionIDではなくDivisionShortcut(ABやBCなど)を表示しているものが必要です。あなたのコードを修正しようとしましたが失敗しました。この問題で私を助けてくれますか? –

+0

自分のコードにDivisionNameを追加しました。これを使ってDivisionShortcutを取得することができます。 – Wim

+0

助けてくれてありがとうございますが、クエスチョンには各クイズのDISTINCTユーザー名を計算する必要があります。たとえば、Employee 'Andy'がQuiz#1を4回使用した場合、クエリは1つとして計算する必要があります。クエリは4つとして計算されます。あなたの質問を修正してください。私はそれを修正しようとしたが失敗した。 NrOfQuizesPerDivisionとして (SELECT COUNT(DISTINCT#1 UserQuiz.Username)AS –

関連する問題