我一直在努力做的一组报道,让热量以15个分钟为增量烧毁的总和为“团队”和“用户。TSQL分组的时间开始和结束日期
我使用的表如下:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Teams') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Teams;
CREATE TABLE Teams
(
Team_ID int NOT NULL PRIMARY KEY IDENTITY (1,1),
Team_Name varchar(100),
Team_Description varchar(200)
);
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Users') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Users;
CREATE TABLE Users
(
User_ID int NOT NULL PRIMARY KEY IDENTITY (1,1),
User_Name varchar(100)
);
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Team_User') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Team_User;
CREATE TABLE Team_User
(
Team_ID int,
User_ID int
);
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Workouts') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Workouts;
CREATE TABLE Workouts
(
Workout_ID int NOT NULL PRIMARY KEY IDENTITY (1,1),
User_ID int,
Workout_Type int,
Start_Time datetime,
End_Time datetime,
Calories float
);
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('LK_Workout_Type') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE LK_Workout_Type;
CREATE TABLE LK_Workout_Type
(
WT_ID int NOT NULL PRIMARY KEY IDENTITY (1,1),
Workout_Name varchar (80),
Workout_Description varchar(200)
);
INSERT INTO Teams (Team_Name, Team_Description) VALUES ('A Team', 'We are not vets.');
INSERT INTO Teams (Team_Name, Team_Description) VALUES ('Team Solo', 'One man. One team.');
INSERT INTO Users (User_Name) VALUES ('Frank Appleton');
INSERT INTO Users (User_Name) VALUES ('Tim Murdock');
INSERT INTO Users (User_Name) VALUES ('Tim Smith');
INSERT INTO Team_User (Team_ID, User_ID) Values (1,1);
INSERT INTO Team_User (Team_ID, User_ID) Values (1,2);
INSERT INTO Team_User (Team_ID, User_ID) Values (2,3);
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Bike - Mountain','Trail riding.');
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Bike - Road','Road riding.');
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Elliptical','Standard elliptical');
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Running','Typical running');
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Treadmill','Treadmill running');
INSERT INTO LK_Workout_Type (Workout_Name, Workout_Description) VALUES ('Weights','Weightroom');
INSERT INTO Workouts (User_ID, Workout_Type, Start_Time, End_Time, Calories) VALUES (1,1,'3/10/2012 08:00:00 AM','3/10/2012 09:30:00 AM', 860);
INSERT INTO Workouts (User_ID, Workout_Type, Start_Time, End_Time, Calories) VALUES (2,1,'3/10/2012 08:30:00 AM','3/10/2012 10:45:00 AM', 950);
INSERT INTO Workouts (User_ID, Workout_Type, Start_Time, End_Time, Calories) VALUES (3,5,'3/10/2012 10:05:00 AM','3/10/2012 12:27:00 PM', 1917);
INSERT INTO Workouts (User_ID, Workout_Type, Start_Time, End_Time, Calories) VALUES (1,5,'3/10/2012 02:38:00 PM','3/10/2012 03:17:00 PM', 536);
有一个问题我想生成显示由给定团队燃烧的卡路里的报告,在特定的增量和时限所以,如果我想要显示从8烧毁A-队的卡路里。上午到下午6点在给定的一天,以15分钟为增量,报告应该是这样的:
TheDt Team Calories
上午八时00分零零秒A-队860
上午08点15分○○秒A-队860
上午08时30分00秒A-1810队
上午8时45分○○秒A-1810队
上午9时00分〇〇秒A-1810队
上午9点15分00秒A-1810队
上午9点30分○○秒A-1810队
上午09时45分○○秒A-950队
10: 00:00 AM A-950队
上午10点一十五分00秒A-950队
上午十时三十分00秒A-950队
10:45:上午12点A-950队
上午11时00分00秒A-队0
....
下午2点30分〇〇秒A-队0
下午2点45分00秒A-队536
下午3点00分〇〇秒特攻队536
下午3点15分零零秒攻队536
下午3时30分○○秒A-队0
...
下午6时00分00秒特攻队0
在我的研究中,我发现使用表格来支持增量(15分钟)并将其加入到我的锻炼表格中应该会有所帮助。所以,我创建了如下表:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Tally') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Tally;
CREATE TABLE Tally
(N INT,
CONSTRAINT PK_Tally_N PRIMARY KEY CLUSTERED (N))
-----------Create and preset a loop counter
DECLARE @Counter INT
SET @Counter = 0
-----------Populate the table with 15 minute intervals between 2012 and 2017
WHILE @Counter <= 175299
BEGIN
INSERT INTO Tally (N) VALUES (@Counter) SET @Counter = @Counter + 1
END
-----------Build the CalendarDT Table
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('CalendarDT') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE CalendarDT;
DECLARE @StartDT DATETIME;
SELECT @StartDT = '2012-01-01T00:00:00';
SELECT DATEADD(mi,v.N*15,@StartDT) AS TheDT INTO CalendarDT FROM Tally v WHERE v.N BETWEEN 0 AND 175299;
-----------Creating a clustered index for performance
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('IDXC_CalendarDT_TheDT') AND OBJECTPROPERTY(id, 'IsIndex') = 1)
DROP INDEX CalendarDT.IDXC_CalendarDT_TheDT;
CREATE CLUSTERED INDEX IDXC_CalendarDT_TheDT ON CalendarDT (TheDT)
GO
-----------Drop the Tally table
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('Tally') AND OBJECTPROPERTY(id, 'IsTable') = 1)
DROP TABLE Tally;
然后我试图加入我的训练表具有以下:
SELECT CalendarDT.TheDT AS [Date], COALESCE(SUM(Workouts.Calories),0) AS CalorieCnt, Workouts.User_ID
FROM CalendarDT
LEFT OUTER JOIN Workouts ON Workouts.Start_Time >= '03/10/2012 08:00:00 AM' AND Workouts.End_Time < '03/10/2012 06:00:00 PM'
AND CalendarDT.TheDT >= '03/10/2012 08:00:00 AM' AND CalendarDT.TheDT <= '03/10/2012 06:00:00 PM'
WHERE Workouts.User_ID IN (SELECT User_ID FROM Team_User WHERE Team_ID = 1)
GROUP BY CalendarDT.TheDT, Workouts.User_ID
ORDER BY CalendarDT.TheDT;
这是接近我已经能够得出解决方案。但是,我有几个问题:
1)我还没有想出如何从JOIN语句中加入Team_Name。
2)CalorieCnt,即使它是由Team_Name而不是User_ID聚合显示每个时间段相同的值。它不是在每个给定的时间内正确汇总总数,包括那些应该为0的时间。
我认为其中一个问题是,我无法比较说08:45有多少卡路里被燃烧:00 AM,因为当时没有锻炼开始/结束。 我一直在寻找这一段时间,我很难过。任何帮助获得这些报告为个人用户和团队工作将不胜感激!
“卡路里”中的值是指“15分钟内消耗的卡路里”或“锻炼期间消耗的卡路里”? – Quassnoi 2012-04-07 20:20:20
Workouts.calories是锻炼过程中燃烧的卡路里数。由于Workouts.calories适用于整个锻炼,因此该报告不如其准确。并且,生成的报告每15分钟一次。我意识到这一点。但是,这是我必须处理的数据。而且,确实为报告增添了价值。 – user1319487 2012-04-07 20:21:47