-1

MS Access クエリを SQL Server ストアド プロシージャに変換しようとしていますが、関連のない 2 つのテーブルのフィールドの合計とグループ化に問題があります。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クエリに似たIFのみを合計する方法
  2. [Current_Year]-1, tbl_CalendarYear.Current_Yearアクセスクエリに似たHOW TO GROUP BY

親切なアドバイス。ありがとうございました。

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は変数なので、グループ化する必要はありません。

Amountまた、Accessクエリがwhereを合計していることにも気付き[Actuals_Year]<>[Current_Year]ましたが、質問(1)で、whereを合計する必要があると言っています[Actuals_Year]=[Current_Year]。私の答えはAccessバージョンに従います。

于 2012-06-23T18:49:16.163 に答える