Hi Everyone,
I need help writing the following query. I have to group my data by Department and have a field that will calculation the number of minutes that employee worked in that department. So basically I take the total number of minutes worked in the department and divide it by the total number of minutes the employee worked for the specified date range.
--
Agent Name: John Doe
Date Range: 1/1/2007 - 6/30/2007
RowID Work Minutes in Dept Total Work Minutes Dept
1 26355 52920 Service
2 9000 52920 Parts
3 17565 52920 Dispatch
Service = 26355 / 52920 = 0.499 = 50%
Parts = 9000 / 52920 = 0.17 = 17%
Dispatch= 17565 / 52920 = 0.33 = 33%
--
How can I accomplish this?
I am using SQL Server 2005 Express
Thank You
Assuming your table is the grouped sum's by department:
Code Snippet
create table #t1 (RowID int, [Work Minutes] int, [Total Work Minutes] int, Dept varchar(20) )
insert into #t1
select 1, 26355, 52920, 'Service'
union all select 2, 9000, 52920, 'Parts'
union all select 3, 17565, 52920, 'Dispatch'
select Dept, ' = ' + convert(varchar(15), [Work Minutes]) + ' / ' + convert(varchar(15), [Total Work Minutes]),
round(([Work Minutes]*100.00)/[Total Work Minutes], 0) as 'Percentage'
from #t1
|||DaleJ,
The table data is not grouped. Thats what makes this query complex.
|||
SamCosta wrote:
DaleJ,
The table data is not grouped. Thats what makes this query complex.
Can you right click the tables that you are using and choose "Script Table As..." and "Create To.." and post those back here. Once we have your structure we can help further.|||
And some additional sample data.
It's not that difficult, but would like to get it right the first time (or two )
|||
Code Snippet
SELECT E.EMPID,
E.DEPTID,
CMS.Productivity(CMS.TrueCalls(SUM(D.ti_stafftime), SUM(D.ti_availtime), SUM(D.acdcalls)), SUM(D.acdcalls),
Agent.AbsentPercentage(SUM(CONVERT(int, A.TOTALABSENT)), SUM(CONVERT(int, A.TOTALWORKMI))), E.DEPTID) AS AvgPLevel,
SUM(CONVERT(int, A.TOTALWORKMI)) AS DEPTWORKMI
FROM CMS.dAgent AS D INNER JOIN dbo.EMP_DEPT_ASSOC AS E ON D.EmployeeID = E.EMPID AND D.row_date >= E.STARTDATE AND D.row_date
<= E.STOPDATE INNER JOIN EmpAbsents As A ON D.row_date = A.ROW_DATE AND D.EmployeeID = A.EMPID
WHERE (D.row_date BETWEEN @.FromDate AND @.ToDate) AND (D.EmployeeID = @.EmpID)
GROUP BY E.ID, E.DEPTID
This query outputs:
EmpID DeptID AvgPLevel DeptWorkMI
28899 Service 2 17244
28899 Parts 3 9000
28899 Dispatch 1 27836
I need to then group the query results by EmpID to get a total Average Productivity Level
Result:
EmpID AvgPLevel
28899 2
How to calculate total productivity level:
(2 * 17244 / 54080) + (3 * 9000 / 54080) + (1 * 27836 / 54080) = 1.65 = Level 2
54080 is the total number of minutes worked in ALL departs. (17244 + 9000 + 27836 = 54080)
Thank You
|||See if this does what you need:
Code Snippet
;WITH base
AS
(
SELECT E.EMPID,
E.DEPTID,
CMS.Productivity(CMS.TrueCalls(SUM(D.ti_stafftime), SUM(D.ti_availtime), SUM(D.acdcalls)), SUM(D.acdcalls),
Agent.AbsentPercentage(SUM(CONVERT(int, A.TOTALABSENT)), SUM(CONVERT(int, A.TOTALWORKMI))), E.DEPTID) AS AvgPLevel,
SUM(CONVERT(int, A.TOTALWORKMI)) AS DEPTWORKMI
FROM CMS.dAgent AS D INNER JOIN dbo.EMP_DEPT_ASSOC AS E ON D.EmployeeID = E.EMPID AND D.row_date >= E.STARTDATE AND D.row_date
<= E.STOPDATE INNER JOIN EmpAbsents As A ON D.row_date = A.ROW_DATE AND D.EmployeeID = A.EMPID
WHERE (D.row_date BETWEEN @.FromDate AND @.ToDate) AND (D.EmployeeID = @.EmpID)
GROUP BY E.ID, E.DEPTID
),
Totals
AS
(
SELECT EmpID, SUM(DeptWorkMi) AS TotalMinutes
FROM base
GROUP BY EmpID
)
SELECT b.EmpID, ROUND(SUM(1.0 * b.AvgPLevel * b.DeptWorkMI / t.TotalMinutes), 0) as AvgPLevel
FROM base b
INNER JOIN Totals AS t
ON b.EmpID = t.EmpID
GROUP BY b.EmpID
|||Thank you DaleJ. I was able to solve this problem using the CTE query example you provided.
No comments:
Post a Comment