2012-06-23 129 views
-1

我试图将MS Access查询转换为SQL Sever存储过程,但是存在两个无关表中的求和和分组字段的问题。它可以在MS Access中执行,但我无法在SQL Server存储过程中复制它。将访问查询转换为SQL Server存储过程

这里的MS Access查询我想转换 -

MS Access查询

SELECT Tbl_Actuals.PS 
, [tbl_CalendarYear.Current_Year]-1 AS [Previous Year] 
, tbl_CalendarYear.Current_Year 
, Tbl_Actuals.Source 
, Tbl_Actuals.Program_Code 
, IIf([Source]="Leasehold",Sum(IIf([Actuals_Year]<>[Current_Year], ([Amount]),Null)),Null) AS PrevYearAmount 
FROM Tbl_Actuals, tbl_CalendarYear 
GROUP BY Tbl_Actuals.PS 
, [tbl_CalendarYear.Current_Year]-1 
, tbl_CalendarYear.Current_Year 
, Tbl_Actuals.Source 
, Tbl_Actuals.Program_Code 
ORDER BY Tbl_Actuals.Program_Code; 

下面是上面的SQL Server存储过程的转换。

declare @CurrentYear float 
declare @PrevYear float 

SET @CurrentYear=(SELECT [Current_Year] FROM tbl_CalendarYear) 
SET @PrevYear= (SELECT [Current_Year] -1 FROM tbl_CalendarYear) 

SELECT PS 
, @CurrentYear as CurrentYear 
, @PrevYear as PreviousYear 
, A.Source 
, A.Program_Code 
, CASE WHEN (A.Source='Leasehold') THEN SUM(A.Amount) -- HOW TO DO SUM ONLY IF  [A.Actuals_Year]=[Current_Year] similar to Access Query END AS PrevYearAmount 
FROM Tbl_Actuals A 
GROUP BY PS 
, Source 
, Program_Code -- HOW TO GROUP BY [Current_Year]-1, tbl_CalendarYear.Current_Year similar to Access Query 
ORDER BY Program_Code; 

这里是我的问题,与SQL转换 -

  1. HOW TO DO SUM ONLY IF [A.Actuals_Year]=[Current_Year]类似于Access查询
  2. HOW TO GROUP BY [Current_Year]-1, tbl_CalendarYear.Current_Year类似

请访问查询建议。谢谢。

+2

为什么你将'Year'作为'FLOAT'存储?你能显示样本数据和期望的结果吗?我不确定我明白'GROUP BY SomeYear-1'的含义... –

+0

当你已经用[Current_Year]分组时,为什么你需要通过'[Current_Year] -1'进行分组? –

回答

0

这似乎有点像一个奇怪的数据库设计的,但是这可能会给你你需要的东西:

DECLARE @CurrentYear float 
DECLARE @PrevYear float 

SELECT @CurrentYear = MAX([Current_Year]) FROM tbl_CalendarYear 
SET @PrevYear = @CurrentYear - 1 

SELECT [PS] 
    ,@CurrentYear as CurrentYear 
    ,@PrevYear as PreviousYear 
    ,[Source] 
    ,[Program_Code] 
    ,SUM(CASE WHEN [Source]='Leasehold' AND [Actuals_Year] <> @CurrentYear THEN 
     [Amount] 
     ELSE 
      0 
     END) PrevYearAmount 
FROM Tbl_Actuals 
GROUP BY [PS] 
    ,[Source] 
    ,[Program_Code] 
ORDER BY [Program_Code]; 

关于问题(2),因为@CurrentYear@PrevYear是变量,你不需要由他们组成。

我还注意到,您的访问查询正在求和Amount其中[Actuals_Year]<>[Current_Year]但在你的问题(1)你说它应该总结在哪里[Actuals_Year]=[Current_Year]。我的答案在Access版本之后。

相关问题