2014-03-25 96 views
0

我想合併2個獨立工作並且理想情況下優化查詢的查詢。第一個查詢返回各種合同信息,最後一個變量'@InYearMonths'確定總月數在本財政年度報告。SSMS 2008合併2個查詢

第一個查詢是:

Declare @ReportID int, @OrgId nvarchar(10), @FYStartDate DATETIME, @InYearMonths INT 
Select @ReportID = '58', @OrgId = '%', @FYStartDate = '2013-04-01', @InYearMonths = '12' 

SELECT Categories.Category, Contracts.ContractName, ContractUptakeStatus.Description AS  UptakeStatus, ContractUptakeStatus.RAGCode AS UptakeRAG, 
     ContractBenefitActuals.ActualValueCR, ContractBenefitActuals.ActualValueCA, ContractSharing.SavingsStartDate, ContractBenefitOpportunity.AnnualSpend, 
     ContractBenefitOpportunity.AnnualisedOppCR, ContractBenefitOpportunity.AnnualisedOppCA, ContractBenefitOpportunity.CurrentFYCR, 
     ContractBenefitOpportunity.CurrentFYCA, ContractBenefitOpportunity.NextFYCR, ContractBenefitOpportunity.NextFYCA, Categories.CategoryColour, 
     ContractSharing.OrgID, Organisations.Organisation, ContractBenefitReporting.Year, ContractBenefitReporting.Period, ContractBenefitReporting.Version, 
     Categories.CategoryForeColour, Contracts.StartDate, Contracts.EndDate, ContractBenefitActuals.ActualSpend, 
     CASE WHEN SavingsStartDate IS NOT NULL THEN CASE WHEN 
     DateDiff(MM, SavingsStartDate, CAST('01/04/' + CAST([Year] - 1 AS NVARCHAR(10)) AS datetime)) between -12 and 0 
     THEN(SELECT ISNULL(SUM(ActualValueCR),0) as InYearCRSavings 
FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY ContractBenefitActualsDetail.ActualDetailID 
ORDER BY ContractBenefitActualsDetail.Period DESC) AS InYearPeriod, * 
FROM ContractBenefitActualsDetail 
) AS InYearValue 
WHERE InYearValue.ActualsID = contractBenefitActuals.actualsid 
AND InYearValue.Period <= @InYearMonths) ELSE 0 END ELSE 0 END AS InYearCR, 
     ContractUptakeStatus.UptakeStatusID 
FROM ContractBenefitReporting INNER JOIN 
     ContractBenefitReporting_SharesInReport ON ContractBenefitReporting.ReportID = ContractBenefitReporting_SharesInReport.ReportID INNER JOIN 
     ContractSharing ON ContractBenefitReporting_SharesInReport.ShareID = ContractSharing.ShareID INNER JOIN 
     Contracts ON ContractSharing.ContractID = Contracts.ContractID INNER JOIN 
     Categories ON Contracts.CategoryID = Categories.CategoryID INNER JOIN 
     ContractUptakeStatus ON ContractSharing.UptakeStatusID = ContractUptakeStatus.UptakeStatusID INNER JOIN 
     Organisations ON ContractSharing.OrgID = Organisations.OrgID LEFT OUTER JOIN 
     ContractBenefitOpportunity ON ContractSharing.ShareID = ContractBenefitOpportunity.ShareID AND 
     ContractBenefitReporting_SharesInReport.BenefitVersion = ContractBenefitOpportunity.Version AND 
     ContractBenefitReporting.Year = ContractBenefitOpportunity.FiscalYear AND ContractBenefitReporting.Period = ContractBenefitOpportunity.Period LEFT OUTER  JOIN 
     ContractBenefitActuals ON ContractSharing.ShareID = ContractBenefitActuals.ShareID AND 
     ContractBenefitReporting_SharesInReport.BenefitVersion = ContractBenefitActuals.Version AND 
     ContractBenefitReporting.Year = ContractBenefitActuals.FiscalYear AND ContractBenefitReporting.Period = ContractBenefitActuals.Period 
WHERE (ContractBenefitReporting.ReportID = @ReportID) AND (Organisations.Organisation LIKE @OrgID) 

第二個查詢被用來確定變量「@InYearMonths」:

Declare @FYStartdate datetime, @Reportid int 
Select @FYStartdate = '2013-04-01', @Reportid = '58' 

SELECT  ISNULL(DATEDIFF(MM, dbo.ContractSharing.SavingsStartDate, @FYStartDate), 0) AS  InYearMonths 
FROM   dbo.ContractBenefitReporting_SharesInReport INNER JOIN 
         dbo.ContractBenefitActuals ON dbo.ContractBenefitReporting_SharesInReport.BenefitVersion = dbo.ContractBenefitActuals.Version AND 
         dbo.ContractBenefitReporting_SharesInReport.ShareID = dbo.ContractBenefitActuals.ShareID INNER JOIN 
         dbo.ContractBenefitReporting ON dbo.ContractBenefitReporting_SharesInReport.ReportID = dbo.ContractBenefitReporting.ReportID AND 
         dbo.ContractBenefitActuals.FiscalYear = dbo.ContractBenefitReporting.Year AND 
         dbo.ContractBenefitActuals.Period = dbo.ContractBenefitReporting.Period INNER JOIN 
         dbo.ContractSharing ON dbo.ContractBenefitReporting_SharesInReport.ShareID = dbo.ContractSharing.ShareID 
WHERE  (dbo.ContractBenefitReporting_SharesInReport.ReportID = @Reportid) 

我需要內的動態計算這個「@InYearMonths」變量第一個查詢 - 有沒有人有任何建議?

回答

0

動態地,你的意思是說,在第一個查詢中,@InYearMonths的值可以逐行不同?如果沒有 - 如果這個變量是一個單身人士,我不明白你爲什麼要組合這兩個查詢。看起來第一個查詢取決於第二個評估@InYearMonths。你能澄清兩個查詢之間的關係嗎?