Sql 如果您是对的,视图vwCHHoursByAreaByWeek可能包含重复的行。我让OP来确定视图上是否有唯一的索引,或者其他一些保证不会有重复行的方法。鉴于视图的名称后固定为“ByWeek”,我有一种感觉,OP将发现没有重复的行,并将使用更有效的GROUP
Sql 如果您是对的,视图vwCHHoursByAreaByWeek可能包含重复的行。我让OP来确定视图上是否有唯一的索引,或者其他一些保证不会有重复行的方法。鉴于视图的名称后固定为“ByWeek”,我有一种感觉,OP将发现没有重复的行,并将使用更有效的GROUP,sql,sql-server,views,Sql,Sql Server,Views,如果您是对的,视图vwCHHoursByAreaByWeek可能包含重复的行。我让OP来确定视图上是否有唯一的索引,或者其他一些保证不会有重复行的方法。鉴于视图的名称后固定为“ByWeek”,我有一种感觉,OP将发现没有重复的行,并将使用更有效的GROUP BY子句。名为vwchhoursbyreabyweek的视图可能不仅仅是“ByWeek”;它也是“按区域”。如果区域被添加,会发生什么?远离的?细分?对于维护人员来说,这是一个巨大的地雷。嗨,有了可用的信息@Mike,我认为这两个答案都很好。
如果您是对的,视图vwCHHoursByAreaByWeek可能包含重复的行。我让OP来确定视图上是否有唯一的索引,或者其他一些保证不会有重复行的方法。鉴于视图的名称后固定为“ByWeek”,我有一种感觉,OP将发现没有重复的行,并将使用更有效的
GROUP BY
子句。名为vwchhoursbyreabyweek的视图可能不仅仅是“ByWeek”;它也是“按区域”。如果区域被添加,会发生什么?远离的?细分?对于维护人员来说,这是一个巨大的地雷。嗨,有了可用的信息@Mike,我认为这两个答案都很好。我以前没有使用过这两种方法,但需要类似的方法,结果运行效率低下的sql。我知道这是错误的,但不知道解决问题的方法。如果在这种情况下,视图下面的表上有一个PK。然而,简写的OP是什么意思呢?@IanW,OP只是“原创海报”的意思。这是一个互联网俚语,指的是开始一个线程/对话的人。Hi@Anon以前从未见过交叉应用,所以必须用谷歌搜索它。为什么@Mike的方法比其他方法更有优势?嗨@Anon:我刚刚在我们的服务器上运行了这两种方法,您的方法的子树成本为61259.1,Mike的方法的子树成本为2887.23。在我所做的一点培训中(子树成本)是向我解释检查效率的方式,尽管我可以理解其中会包含可维护性。不用说,这两种方法都是对我的方法的巨大改进!!:)速度方面,连接将更快。它假设没有两行具有重叠的开始和结束范围,从而将总数相加。如果他们这样做,那么数据将被重复计数,总数将不正确。交叉应用拒绝了这一假设,并安全地计算了总和。这里有三种保护自己的好方法:1)使用交叉应用(如果足够快的话)2)每周在vwchHoursbyArea上做一个PK(在下面的表上有一个PK是没有意义的)3)使用SCHEMABINDING(一般来说是好的做法,但是如果你没有设置它,那会让你感到很痛苦)Hi@Anon以前从未见过交叉应用,所以必须用谷歌搜索它。为什么@Mike的方法比其他方法更有优势?嗨@Anon:我刚刚在我们的服务器上运行了这两种方法,您的方法的子树成本为61259.1,Mike的方法的子树成本为2887.23。在我所做的一点培训中(子树成本)是向我解释检查效率的方式,尽管我可以理解其中会包含可维护性。不用说,这两种方法都是对我的方法的巨大改进!!:)速度方面,连接将更快。它假设没有两行具有重叠的开始和结束范围,从而将总数相加。如果他们这样做,那么数据将被重复计数,总数将不正确。交叉应用拒绝了这一假设,并安全地计算了总和。这里有三种保护自己的好方法:1)使用交叉应用(如果速度足够快)2)每周在vwchHoursbyArea上进行PK(在下面的表上有一个PK是没有意义的)3)使用SCHEMABINDING(一般来说是好的做法,但如果你没有为此做好准备,这会让你很痛苦)
WageYear StartDate EndDate Week No
2013/14 16/11/2013 22/11/2013 34
2013/14 09/11/2013 15/11/2013 33
2013/14 02/11/2013 08/11/2013 32
2013/14 26/10/2013 01/11/2013 31
StockCode TrnYear TrnMonth EntryDate IntoDespKg
Part A 2013 1 06/04/2012 634.5
Part A 2013 1 23/04/2012 634.5
Part B 2013 2 03/05/2012 660
Part B 2013 2 03/05/2012 660
WageYear StartDate EndDate Week No IntoDespKg TCastKg
2013/14 16/11/2013 22/11/2013 34 141170.925 173840.482
2013/14 09/11/2013 15/11/2013 33 149969.934 134483.17
2013/14 02/11/2013 08/11/2013 32 137661.513 165725.115
2013/14 26/10/2013 01/11/2013 31 137586.634 179026.199
SELECT [WageYear]
,[StartDate]
,[EndDate]
,[Week No]
------------------Std Information------------------
,(Select sum ([IntoDespKg]) from [dbo].[CHCIW_RecoveryLabDirectMins]
where ([EntryDate] >=W.[StartDate] and [EntryDate] <=W.[EndDate])) As IntoDespKg
,(Select sum ([CastKg]) from [dbo].[CHCIW_RecoveryLabDirectMins]
where ([EntryDate] >=W.[StartDate] and [EntryDate] <=W.[EndDate])) As [TCastKg]
,(Select sum (CoreDirectMins)/60 from [dbo].[CHCIW_RecoveryLabDirectMins]
where ([EntryDate] >=W.[StartDate] and [EntryDate] <=W.[EndDate])) As [CoreDirectHrs]
FROM [Wages].[vwCHHoursByAreaByWeek] W
ORDER BY EndDate DESC
SELECT [WageYear]
,[StartDate]
,[EndDate]
,[Week No]
------------------Std Information------------------
,IntoDespKg
,[TCastKg]
,[CoreDirectHrs]
FROM [Wages].[vwCHHoursByAreaByWeek] W
CROSS APPLY (
SELECT
sum ([IntoDespKg]) IntoDespKg,
sum ([CastKg]) [TCastKg],
sum (CoreDirectMins)/60 [CoreDirectHrs]
from [dbo].[CHCIW_RecoveryLabDirectMins]
where ([EntryDate] >=W.[StartDate] and [EntryDate] <=W.[EndDate])
) H
SELECT HoursByAreaByWeek.WageYear
,HoursByAreaByWeek.StartDate
,HoursByAreaByWeek.EndDate
,HoursByAreaByWeek.[Week No]
,Sum(RecoveryLabDirectMins.IntoDespKg) As IntoDespKg
,Sum(RecoveryLabDirectMins.CastKg) As TCastKg
,Sum(CoreDirectMins / 60) As CoreDirectHrs
FROM Wages.vwCHHoursByAreaByWeek As HoursByAreaByWeek
JOIN dbo.CHCIW_RecoveryLabDirectMins As RecoveryLabDirectMins
ON RecoveryLabDirectMins.EntryDate Between HoursByAreaByWeek.StartDate AND HoursByAreaByWeek.EndDate
GROUP BY HoursByAreaByWeek.WageYear
,HoursByAreaByWeek.StartDate
,HoursByAreaByWeek.EndDate
,HoursByAreaByWeek.[Week No]
ORDER BY EndDate DESC