2012-07-31 4 views
3

이 선택 항목에서 지난 달 및 현재 월의 값을 가져 와서 6 개의 열을 표시하려고합니다. OLDVALUE 자체 ~ OLDVALUE X 28,8 % ~ OLDVALUE X 8 % ~ CURVALUE 자체 ~ CURVALUE X 28,8 % ~ CURVALUE X 8 %변수에 SQL 하위 쿼리를 할당하고 동일한 컨텍스트에서 사용하는 방법

하지만 아래에 나와있는 것과 같이 동일한 하위 쿼리로 이전 달에 3 번 가져 가야합니다. 이렇게하면 코드가 매우 커지고 성능이 떨어집니다 (자세한 정보를 원합니다).

"임시"변수를 할당하여이 부속 쿼리의 결과를 동일한 컨텍스트에서 다시 사용하도록 유지하는 방법이 있습니까? 루프 구조의 변수처럼 행별로 값을 변경 하시겠습니까?

감사합니다.

/* == PARAMETERS == */ 
DECLARE @ANO INT = 2011 
DECLARE @MES INT = 7 

/* ===================================== SELECT ===================================== */ 
SELECT FUNC.CHAPA, FUNC.CODSECAO, 
     (SELECT VALPROVFER FROM PFHSTPROV (NOLOCK) 
      WHERE CHAPA = FUNC.CHAPA 
      AND ANO = CASE WHEN (PROV.MES-1 = 0) THEN PROV.ANO-1 ELSE PROV.ANO END 
      AND MES = CASE WHEN (PROV.MES-1 = 0) THEN 12 ELSE PROV.MES-1 END 
     ) AS PROVFERMESANT, 
     (SELECT VALPROVFER FROM PFHSTPROV (NOLOCK) 
      WHERE CHAPA = FUNC.CHAPA 
      AND ANO = CASE WHEN (PROV.MES-1 = 0) THEN PROV.ANO-1 ELSE PROV.ANO END 
      AND MES = CASE WHEN (PROV.MES-1 = 0) THEN 12 ELSE PROV.MES-1 END 
     )*0.288 AS PROVINSSMESANT, 
     (SELECT VALPROVFER FROM PFHSTPROV (NOLOCK) 
      WHERE CHAPA = FUNC.CHAPA 
      AND ANO = CASE WHEN (PROV.MES-1 = 0) THEN PROV.ANO-1 ELSE PROV.ANO END 
      AND MES = CASE WHEN (PROV.MES-1 = 0) THEN 12 ELSE PROV.MES-1 END 
     ) * 0.08 AS PROVFGTSMESANT, 
     PROV.VALPROVFER AS PROVFERMES, PROV.VALPROVFER*0.288 AS PROVINSSMES, 
     PROV.VALPROVFER*0.08 AS PROVFGTSMES, 
FROM PFUNC FUNC (NOLOCK) 
JOIN PFHSTPROV PROV (NOLOCK) ON FUNC.CHAPA = PROV.CHAPA 
    AND FUNC.CODCOLIGADA = PROV.CODCOLIGADA 
WHERE FUNC.CODSITUACAO = 'A' 
    AND ANO = @ANO 
    AND MES = @MES 

답변

2
SELECT FUNC.CHAPA, FUNC.CODSECAO, 
      isnull(PFH.VALPROVFER,0) AS PROVFERMESANT, 
      isnull(PFH.VALPROVFER,0)*0.288 AS PROVINSSMESANT, 
      isnull(PFH.VALPROVFER,0) * 0.08 AS PROVFGTSMESANT, 

      PROV.VALPROVFER AS PROVFERMES, PROV.VALPROVFER*0.288 AS PROVINSSMES, 
      PROV.VALPROVFER*0.08 AS PROVFGTSMES, 
    FROM PFUNC FUNC (NOLOCK) 
    JOIN PFHSTPROV PROV (NOLOCK) ON FUNC.CHAPA = PROV.CHAPA 
     AND FUNC.CODCOLIGADA = PROV.CODCOLIGADA 

    LEFT JOIN PFHSTPROV PFH (NOLOCK) on 
       ((FUNC.CHAPA = PFH.CHAPA) 
          AND PFH.ANO = CASE WHEN (PROV.MES-1 = 0) THEN PROV.ANO-1 ELSE PROV.ANO END 
          AND PFH.MES = CASE WHEN (PROV.MES-1 = 0) THEN 12 ELSE PROV.MES-1 END   
       ) 



    WHERE FUNC.CODSITUACAO = 'A' 
     AND ANO = @ANO 
     AND MES = @MES 
관련 문제