We are using MS SQL SERVER 2012.
We are recording like everytime a user makes a phone call, by adding a Datetime and Userid into a table for each call the user makes.
Now I need to calculate the top monthly, weekly, daily record from the users off all time since creation.
Meaning, I need to calculate the highest monthly count any user ever had for a given month since creation. So the record monthly count, and the name with it.
I'm not really sure how to best go for that.This is what I created for now,and I was wondering if there is a better or more efficient way to do that.
Here is the updated version with sample. (I applied the date change, I hope this helps)
This is for the monthly record:
DECLARE @id int, @mr int
DECLARE @first datetime, @last datetime
DECLARE @name nvarchar(60)
DECLARE @UserTable TABLE(
ID int,
Name nvarchar(60)
)
INSERT INTO @UserTable (ID, Name) VALUES (1, 'Tester');
INSERT INTO @UserTable (ID, Name) VALUES (2, 'Dummy');
INSERT INTO @UserTable (ID, Name) VALUES (3, 'User');
DECLARE @SampleTable TABLE(
A_Termin_AE int,
A_Termin_Status int,
A_Termin_Set_Date datetime
)
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, CAST('20090525' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 601, Cast('20090512' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20090525' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100803' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100805' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 603, Cast('20100817' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (1, 601, Cast('20110521' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 601, Cast('20090501' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20090502' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20100815' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110501' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110505' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110508' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110510' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (2, 603, Cast('20110514' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120503' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120508' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120510' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120514' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20120520' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 601, Cast('20130701' AS Datetime));
INSERT INTO @SampleTable (A_Termin_AE, A_Termin_Status, A_Termin_Set_Date) VALUES (3, 603, Cast('20130703' AS Datetime));
DECLARE @TempTable TABLE(
ID int,
UserID int,
Name nvarchar(60),
Record int,
Datum datetime
)
INSERT INTO @TempTable (ID, UserID, Name, Record, Datum) VALUES (1, 0, '', 0, GETDATE());
SET @first = CAST('20080101' AS Datetime);
WHILE @first < GETDATE()
BEGIN
SET @first = dateadd(month, 1, @first)
SET @last = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@first)+1,0));
DECLARE User_Cur CURSOR
FOR SELECT tu.Id, tu.Name FROM @UserTable tu
OPEN User_Cur;
FETCH NEXT FROM User_Cur INTO @id, @name;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @mr = (SELECT COUNT(t.A_Termin_Set_Date)
FROM @SampleTable t
WHERE t.A_Termin_AE = @id
AND t.A_Termin_Status = 603
AND t.A_Termin_Set_Date BETWEEN @first AND @last);
IF (SELECT Record FROM @TempTable WHERE ID = 1) < @mr
BEGIN
UPDATE @TempTable
SET UserID = @id,
Name = @name,
Record = @mr,
Datum = @first
WHERE ID = 1;
END
FETCH NEXT FROM User_Cur INTO @id, @name;
END
CLOSE User_Cur;
DEALLOCATE User_Cur;
END
SELECT * FROM @TempTable;
So the user with the most calls made in a month is: 'Dummy' with 5 Records in May 2011;
I appreciate any help and suggestions on this.