2012-07-31 26 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 
相關問題