[请提出一种我应该遵循的方法,因为我显然遗漏了这一点。我是SQL的新手,但仍然考虑MS Access。这是我要执行的操作的一个示例:就像我说的,不用担心细节,我只想知道如何在SQL中执行此操作。
我有下表:
小时工作量(工作人员,日期,小时)(超过20万条记录)Units_Done(团队,日期,类型)(几千条记录)Rate_Per_Unit(日期,团队,RatePerUnit)(几千条记录)Staff_Effort(员工,团队,时间戳)(最终3-4百万条记录)
所以我需要执行以下操作:
1]通过将每个单位乘以RatePerUnit并按“团队和日期分组”来计算每个团队的收入。我创建一个视图TeamEarnPerDay:
Create View teamEarnPerDay AS
SELECT
,Units_Done.Date,
,Units_Done.TeamID,
,Sum([Units_Done]*[Rate_Per_Unit.Rate]) AS Earn
FROM Units_Done INNER JOIN Rate_Per_Unit
ON (Units_Done.quality = Rate_Per_Unit.quality)
AND (Units_Done.type = Rate_Per_Unit.type)
AND (Units_Done.TeamID = Rate_Per_Unit.TeamID)
AND (Units_Done.Date = Rate_Per_Unit.Date)
GROUP BY
Units_Done.Date,
Units_Done.TeamID;
2)通过将Team_Effort分组到Team和Date并计数记录来计算TEAM的工作量。该表有几百万条记录。我必须将时间戳记转换为日期。...
CREATE View team_effort AS
SELECT
TeamID
,CAST([Timestamp] AS Date) as TeamDate,
,Count(Staff_EffortID) AS TeamEffort
FROM Staff_Effort
GROUP BY
TeamID
,CAST([Timestamp] AS Date);
3)计算球队的薪金比率:(1)球队收益/(2)球队努力我使用上面创建的2个视图。这种观点的表现下降了,但我仍然可以接受。
Create View team_rate_of_pay AS
SELECT
tepd.Date
,tepd.TeamID
,tepd.Earn
,tepd.TeamBags
,[Earn]/[TeamEffort] AS teamRate
FROM teamEarnPerDay
INNER JOIN team_effort
ON (teamEarnPerDay.Date = team_effort.TeamDate)
AND (teamEarnPerDay.TeamID = team_effort.TeamID);
4)将Staff_Effort分组到Date和Staff上,并计数记录以获取每个人的努力。 (团队努力的一部分)我必须将时间戳记转换为日期。...
Create View staff_effort AS
SELECT
TeamID
,StaffID
,CAST([Timestamp] AS Date) as StaffDate
,Count(Staff_EffortID) AS StaffEffort
FROM Staff_Effort
GROUP BY
,TeamID
,StaffID
,CAST([Timestamp] AS Date);
5)通过以下方式计算员工收入:(4)Staff_Effort x(3)team_rate_of_pay将个人的工作量乘以他每天工作的团队比率。这个速度太慢了。实际上,它没有用。
CREATE View staff_earnings AS
SELECT
staff_effort.StaffDate
,staff_effort.StaffID
,sum(staff_effort.StaffEffort) AS StaffEffort
,sum([StaffEffort]*[TeamRate]) AS StaffEarn
FROM staff_effort INNER JOIN team_rate_of_pay
ON (staff_effort.TeamID = team_rate_of_pay.TeamID)
AND (staff_effort.StaffDate = team_rate_of_pay.Date)
Group By
staff_effort.StaffDate,
staff_effort.StaffID;
所以您明白我的意思了。...我需要各种结果,后续查询取决于这些结果。
我试图做的是为上述每个步骤编写一个视图,然后仅在下一步中使用该视图,依此类推。它们可以正常工作,但查看nr 3的运行速度要比其他运行速度慢,即使仍然可以接受。 View nr 5太慢了。
我实际上在nr.5之后有另一种观点,它也使工作量发挥了作用,但要花几行时间永远是永远的。
我想为每位工作人员写一行,显示他根据上述计算得出的每天收入以及每天的工作时间。
我还尝试通过使用子查询来减少视图数量,但这花费了更长的时间。
一些指导/方向将不胜感激。
提前感谢。
-编辑-
接受评论中发布的查询。做了一些格式化,添加了别名并进行了一些清理,看起来像这样。
SELECT epd.CompanyID
,epd.DATE
,epd.TeamID
,epd.Earn
,tb.TeamBags
,epd.Earn / tb.TeamBags AS RateperBag
FROM teamEarnPerDay epd
INNER JOIN teamBags tb ON epd.DATE = tb.TeamDate
AND epd.TeamID = tb.TeamID;
我最终做了两件事:1)通过使用子查询来减少嵌套视图的nr。这并不能显着提高性能,但似乎使用更少的视图更简单。
2)实际的改进是通过使用LEFT JOIN代替了Inner Join引起的。最终视图使用“内部联接”运行了50分钟,但尚未产生任何一行。使用LEFT JOIN,它可以在20秒内产生所有结果!
希望这对某人有帮助。