2012-06-23 3 views
-1

MS Access 쿼리를 SQL Sever 저장 프로 시저로 변환하려고하지만 관련없는 두 테이블의 필드를 요약하고 그룹화하는 데 문제가 있습니다. 그것은 MS 액세스에서 할 수 있지만 SQL Server 저장 프로 시저에서 복제 할 수 없습니다. 다음은 위의 SQL Server 저장 프로 시저 변환의Access 쿼리를 SQL Server 저장 프로 시저로 변환

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; 

을 -

는 여기에 변환 할 MS Access 쿼리입니다.

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 내 질문에 쿼리를 액세스 할 ONLY IF [A.Actuals_Year]=[Current_Year] 유사한 SUM을 수행하는 방법에

  1. 을 변환 -의
  2. 방법과 유사 [Current_Year]-1, tbl_CalendarYear.Current_Year BY GROUP 쿼리를

친절에 액세스 할 TO 권하다. 고맙습니다.

+2

왜 'Year'를'FLOAT'로 저장하고 있습니까? 샘플 데이터와 원하는 결과를 보여 주시겠습니까? 'GROUP BY SomeYear-1'의 의미를 잘 모르겠다 ... –

+0

'[Current_Year]'로 그룹화 할 때 왜 [Current_Year] -1로 그룹화해야합니까? –

답변

0

그것은 이상한 데이터베이스 설계의 비트처럼 보인다, 그러나 이것은 당신이 필요로하는 무엇을 제공 할 수 있습니다 : 질문 @CurrentYear@PrevYear 변수를 때문에 (2), 당신이 필요하지 않습니다에 관한

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]; 

그 (것)들에 의하여 그룹.

또한 귀하의 액세스 쿼리는 Amount인데, 여기에 [Actuals_Year]<>[Current_Year]인데, 귀하의 질문에 (1) 합계가 [Actuals_Year]=[Current_Year]이어야합니다. 내 대답은 Access 버전을 따릅니다.

관련 문제