无法在连接时组合来自不同数据库的数据的最有效方法

时间:2013-12-02 16:33:47

标签: sql sql-server views

我有两个数据表,我希望在单个视图中将它们组合起来用于报告(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

2 个答案:

答案 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