2015-06-12 101 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;)。 –