Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2008 Forums
 Transact-SQL (2008)
 Joining 4 tables and two counts

Author  Topic 

nmmanas
Starting Member

4 Posts

Posted - 2012-12-05 : 23:42:11
I have four tables.

UserMaster
----------
UserKey - PK
UserName
UserID - UNIQUE

UserLogTransaction
------------------
UserID - FK:UserMaster.UserID
LoginTime
LogoutTime

CallCenter
----------
CallKey - PK
PickedUserKey - FK:UserMaster.UserKey
PickedTime
StartTime
EndTime

JobCardMaster
-------------
JCKey
RecordedUserKey - FK:UserMaster.UserKey
CreatedTime
CallKey - FK:CallCenter.CallKey

This is the scenario: Each user logs in and attends calls. Job cards are created for some of the calls not for all calls.

Problem: I want to get a report which has the following information

UserName | LoginTime | LogoutTime | NoOfCallsAnswered* | NoOfJobCardsCreated* | AverageCallDuration*

* These columns are calculated per session per user. A session is a row from the UserLogTransaction table.

I am stuck on this query for several days. Appreciate any helps or hints.

Thanks

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2012-12-06 : 01:20:50
can we see what you tried yet? this seems to be a simple join query that you require.

------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/

Go to Top of Page

nmmanas
Starting Member

4 Posts

Posted - 2012-12-06 : 01:36:37
quote:
Originally posted by visakh16

can we see what you tried yet? this seems to be a simple join query that you require.

------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/






SELECT UM.UserID, ULT.LogInTime, ULT.LogOutTime, COUNT(CC.PickedUserKey)
FROM dbo.UserMaster UM
JOIN dbo.UserLogTransactions ULT
ON ULT.UserID = UM.UserID
JOIN dbo.CallCenter CC
ON CC.PickedUserKey = UM.UserKey
JOIN dbo.FMJCMaster JC
ON JC.RecordedUserKey = UM.UserKey
WHERE (CC.PickedTime > ULT.LogInTime
AND CC.PickedTime < ULT.LogOutTime)
OR (JC.RecordedUserKey > ULT.LogInTime
AND JC.RecordedUserKey < ULT.LogOutTime)
GROUP BY CC.PickedUserKey, UM.UserID, ULT.LogInTime, ULT.LogOutTime


This is the query I have written so far, it takes nearly a minute to run and I don't get the desired results. I think my approach is wrong.
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2012-12-06 : 01:46:24
its somwhat right

SELECT UM.UserID, ULT.LogInTime, ULT.LogOutTime,CC.Cnt AS NoOfCallsAnswered,JC.Cnt AS NoOfJobCardsCreated,CC.AvgTime AS AverageCallDuration
FROM dbo.UserMaster UM
JOIN dbo.UserLogTransactions ULT
ON ULT.UserID = UM.UserID
JOIN (SELECT PickedUserKey,COUNT(*) AS Cnt,AVG(DATEDIFF(ss,StartTime,EndTime)*1.0) AS AvgTime
FROM dbo.CallCenter
GROUP BY PickedUSerKey)CC
ON CC.PickedUserKey = UM.UserKey
AND (CC.PickedTime > ULT.LogInTime
AND CC.PickedTime < ULT.LogOutTime)
LEFT JOIN (SELECT RecordedUserKey,COUNT(*) AS Cnt
FROM dbo.FMJCMaster
GROUP BY RecordedUserKey
)JC
ON JC.RecordedUserKey = UM.UserKey
AND (JC.CreatedTime > ULT.LogInTime
AND JC.CreatedTime < ULT.LogOutTime)


------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/
Go to Top of Page

nmmanas
Starting Member

4 Posts

Posted - 2012-12-06 : 03:44:42
Thanks for all your input!
I got the following solution from one of my friends. And it works!


SELECT
UM.UserID, ULT.LogInTime, ULT.LogoutTime,
(SELECT COUNT(CC.PickedUserKey)
FROM dbo.CallCenter CC
WHERE
CC.PickedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
CC.PickedTime > ULT.LogInTime AND
CC.PickedTime < ULT.LogOutTime) NoOfCallsAttended,
(SELECT COUNT(JCM.RecordedUserKey)
FROM dbo.JobCardMaster JCM
WHERE JCM.RecordedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
JCM.RecordedUserKey > ULT.LogInTime AND
JCM.RecordedUserKey < ULT.LogOutTime) NoOfJobCardsCreated,
(SELECT AVG(DATEDIFF(ss,CC.StartTime,CC.EndTime)*1.0)
FROM dbo.CallCenter CC
WHERE
CC.PickedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
CC.PickedTime > ULT.LogInTime AND
CC.PickedTime < ULT.LogOutTime) AverageCallDuration
FROM dbo.UserMaster UM
JOIN dbo.UserLogTransactions ULT
ON ULT.UserID = UM.UserID
Go to Top of Page

nmmanas
Starting Member

4 Posts

Posted - 2012-12-06 : 04:50:30
And yet, another alternative solution.

SELECT UM.UserID, UM.UserName,ULT.LoginTime,ULT.LogoutTime
,CC1.NoOfCallsAttended , JCM1.NoOfJobCardsCreated, CC1.AverageCallDuration
FROM UserMaster UM
JOIN UserLogTransactions ULT ON UM.UserID = ULT.UserID

OUTER APPLY (SELECT COUNT(*) NoOfCallsAttended, AVG(DATEDIFF(SECOND, StartTime, EndTime)) AverageCallDuration
FROM CallCenter CC
WHERE CC.PickedUserKey =UM.UserKey AND CC.PickedTime > ULT.LogInTime AND CC.PickedTime < ULT.LogOutTime
) CC1
OUTER APPLY (SELECT COUNT(*) NoOfJobCardsCreated
FROM dbo.JobCardMaster JCM
WHERE JCM.RecordedUserKey =UM.UserKey AND JCM.CreatedTime > ULT.LogInTime AND JCM.CreatedTime < ULT.LogOutTime
) JCM1
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2012-12-07 : 07:31:16
quote:
Originally posted by nmmanas

Thanks for all your input!
I got the following solution from one of my friends. And it works!


SELECT
UM.UserID, ULT.LogInTime, ULT.LogoutTime,
(SELECT COUNT(CC.PickedUserKey)
FROM dbo.CallCenter CC
WHERE
CC.PickedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
CC.PickedTime > ULT.LogInTime AND
CC.PickedTime < ULT.LogOutTime) NoOfCallsAttended,
(SELECT COUNT(JCM.RecordedUserKey)
FROM dbo.JobCardMaster JCM
WHERE JCM.RecordedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
JCM.RecordedUserKey > ULT.LogInTime AND
JCM.RecordedUserKey < ULT.LogOutTime) NoOfJobCardsCreated,
(SELECT AVG(DATEDIFF(ss,CC.StartTime,CC.EndTime)*1.0)
FROM dbo.CallCenter CC
WHERE
CC.PickedUserKey = (SELECT UserKey FROM dbo.UserMaster WHERE UserID = UM.UserID) AND
CC.PickedTime > ULT.LogInTime AND
CC.PickedTime < ULT.LogOutTime) AverageCallDuration
FROM dbo.UserMaster UM
JOIN dbo.UserLogTransactions ULT
ON ULT.UserID = UM.UserID



Better to use joins rather than subqueries as it can cause performance to suffer especially in case of large datasets

------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/

Go to Top of Page
   

- Advertisement -