2015-06-12 99 views
0

我有一個與許多內部連接表的SQL語句,你可以看到下面我有很多條件SUM語句,這些總和給我錯誤(非常大)的數字,因爲內部連接重複相同的值在我的源選擇池中。我想知道ID有一種方法可以限制這些總和條件讓我們對EMPLIDs說。代碼是:SQL條件總和

SELECT 
    A.EMPL_CTG, 
    B.DESCR AS PrName, 
    SUM(A.CURRENT_COMPRATE) AS SALARY_COST_BUDGET, 
    SUM(A.BUDGET_AMT) AS BUDGET_AMT, 
    SUM(A.BUDGET_AMT)*100/SUM(A.CURRENT_COMPRATE) AS MERIT_GOAL, 
    SUM(C.FACTOR_XSALARY) AS X_Programp, 
    SUM(A.FACTOR_XSALARY) AS X_Program, 
    COUNT(A.EMPLID) AS EMPL_CNT, 
    COUNT(D.EMPLID), 
    SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END) AS PRMCNT, 
    SUM(CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END) AS EXPCNT, 
    (SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END)+SUM(CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END))*100/(COUNT(A.EMPLID)) AS PEpercent 
FROM 
    EMP_DTL A INNER JOIN EMPL_CTG_L1 B ON A.EMPL_CTG = B.EMPL_CTG 
    INNER JOIN 
    ECM_PRYR_VW C ON A.EMPLID=C.EMPLID 
    INNER JOIN ECM_INELIG D on D.EMPL_CTG=A.EMPL_CTG and D.YEAR=YEAR(getdate()) 
WHERE 
    A.YEAR=YEAR(getdate()) 
    AND B.EFF_STATUS='A' 
GROUP BY 
    A.EMPL_CTG, 
    B.DESCR 
ORDER BY B.DESCR 

我已經嘗試將D.YEAR = YEAR(getdate())移動到where子句。任何幫助將大大增加

+1

mysql或mssql?它不能是兩個... –

+0

可能重複[SQL不正確地執行連接](http://stackoverflow.com/questions/30805408/sql-not-doing-the-join-correctly) –

+0

@GiorgiNakeuri它是不是可能的重複,如果你看看另一個問題,你會看到我已經問過那個,而那個問題是指另一個問題。在這裏,我想現在我怎麼能修改SUM(CASE ...)行 –

回答

0

可能的原因是您的非常大的數字可能是由於連接A - > B,A - > C和A - > D的笛卡爾積的結果,其中表C和D似乎有多個記錄。所以,舉個例子......如果A有10條記錄,而C對於每條A記錄有10條記錄,那麼你現在有10 * 10條記錄...最後,把它加入到D表中有10條記錄,你現在有10 *每個「A」10 * 10,因此你的臃腫答案。

現在,如何解決。我已根據連接列的基礎將您的「C」和「D」表以及「預先聚合」計數。這樣,他們每個都只有1條記錄,並且已經在該級別計算了總數,並返回到了A表,並且失去了笛卡兒問題。

現在,對於表B,它似乎只是一個查找表,並且無論如何只會是單個記錄結果。

SELECT 
     A.EMPL_CTG, 
     B.DESCR AS PrName, 
     SUM(A.CURRENT_COMPRATE) AS SALARY_COST_BUDGET, 
     SUM(A.BUDGET_AMT) AS BUDGET_AMT, 
     SUM(A.BUDGET_AMT)*100/SUM(A.CURRENT_COMPRATE) AS MERIT_GOAL, 
     PreAggC.X_Programp, 
     SUM(A.FACTOR_XSALARY) AS X_Program, 
     COUNT(A.EMPLID) AS EMPL_CNT, 
     PreAggD.DCount, 
     SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END) AS PRMCNT, 
     SUM(CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END) AS EXPCNT, 
     (SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END 
      + CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END) * 
      100/COUNT(A.EMPLID) AS PEpercent 
    FROM 
     EMP_DTL A 
     INNER JOIN EMPL_CTG_L1 B 
      ON A.EMPL_CTG = B.EMPL_CTG 
      AND B.EFF_STATUS='A' 

     INNER JOIN (select 
          C.EMPLID, 
          SUM(C.FACTOR_XSALARY) AS X_Programp 
         from 
          ECM_PRYR_VW C 
         group by 
          C.EMPLID) PreAggC 
      ON A.EMPLID = PreAggC.EMPLID 

     INNER JOIN (select 
          D.EMPLID, 
          COUNT(*) AS DCount 
         from 
          ECM_INELIG D 
         where 
          D.Year = YEAR(getdate()) 
         group by 
          D.EMPLID) PreAggD 
      ON A.EMPLID = PreAggD.EMPLID 
    WHERE 
     A.YEAR=YEAR(getdate()) 
    GROUP BY 
     A.EMPL_CTG, 
     B.DESCR 
    ORDER BY 
     B.DESCR 
+0

感謝您的詳細回覆DRapp,肯定它有幫助,它對其中一些人有效,但仍然給我錯誤的結果爲comp(SUM)(A.CURRENT_COMPRATE),儘管我不得不將它更改爲:SUM(CASE WHEN A. COMP_FREQUENCY ='H'THEN A.CURRENT_COMPRATE * 2080 ELSE A.CURRENT_COMPRATE END) –

+0

還有一個問題,有兩個PreAggC.X_Programp和PreAggD.DCount,會給我一個錯誤:「Column'PreAggD.DCount'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。「你知道我該怎麼解決它? –

+0

@ user12321在你的「GROUP BY」部分添加'PreAggC.X_Programp,PreAggD.DCount;)。 –