我有两个数据表,我希望在单个视图中将它们组合起来用于报告(excel和ssrs)
问题是视图需要4分钟才能返回75行
任何人都可以建议一个更好的方法,我知道我可以设置一个工作来创建一个表并在一夜之间更新表,然后从平展表中提取我的报告以提高速度,但是有更好的方法吗?
这是基本概要和sql
表1是服务器上一个数据库的摘要数据,并将此类型保存在数据上。这个表有75行
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
第二个数据源是一个视图,它位于一个选择视图上,该视图有四个外部连接到子查询,它返回每日发生的库存移动,并计算生产数据 - 源表有1,090,171行
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
我编写的视图结合了IntoDespKg列的数据和总计,因此它看起来像
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
我的Sql正在使用子查询
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
答案 0 :(得分:1)
Sam Yi指出,您可以使用简单的GROUP BY
语句。如果您期望在dbo.CHCIW_RecoveryLabDirectMins中没有记录的日期范围,则使用LEFT JOIN
。我还为你的表名重新别名。
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
答案 1 :(得分:0)
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