-1

我正在尝试将 MS Access 查询转换为 SQL Sever 存储过程,但在对两个不相关表中的字段求和和分组时遇到问题。可以在 MS Access 中执行此操作,但我无法在 SQL Server 存储过程中复制它。

这是我要转换的 MS Access 查询 -

MS 访问查询

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. [A.Actuals_Year]=[Current_Year]仅在类似于 Access 查询时如何求和
  2. HOW TO GROUP BY[Current_Year]-1, tbl_CalendarYear.Current_Year类似于​​ Access 查询

好心提醒。谢谢你。

4

1 回答 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是变量,你不需要按它们分组。

我还注意到,您的 Access 查询正在对 where 求和Amount[Actuals_Year]<>[Current_Year]但在您的问题 (1) 中,您说它应该 sum where [Actuals_Year]=[Current_Year]。我的回答遵循 Access 版本。

于 2012-06-23T18:49:16.163 回答