2015-06-12 2 views
0

У меня есть инструкция sql со многими внутренними таблицами объединения, как вы можете видеть ниже. У меня есть много условных операторов SUM, эти суммы дают мне неправильные (очень большие) числа, поскольку внутреннее соединение повторяет одни и те же значения в моем источнике выберите пул. Мне было интересно узнать, существует ли способ ограничить эти условия суммирования, скажем, EMPLID. Код: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()) к где п. Любая помощь была бы очень полезна

+1

mysql, или mssql? Это не может быть ... –

+0

Возможный дубликат [SQL не делает соединение правильно] (http://stackoverflow.com/questions/30805408/sql-not-doing-the-join-correctly) –

+0

@GiorgiNakeuri it не является возможным дубликатом, если вы посмотрите на другой вопрос, который вы увидите, я уже спросил об этом, и тот ссылается на другую проблему. Здесь я хочу теперь, как мне изменить строки SUM (CASE ...) –

ответ

0

Вероятная причина ваших очень больших чисел, вероятно, связана с результатом декартова произведения присоединения A -> B, A -> C и A -> D, где отображаются таблицы C и D имеют несколько записей. Итак, просто пример ... если A имеет 10 записей, а C имеет 10 для каждой записи A, теперь у вас есть 10 * 10 записей ... Наконец, присоединитесь к таблице D с 10 записями, теперь у вас есть 10 * 10 * 10 для каждого «А», таким образом, ваши раздутые ответы.

Теперь, как решить. Я взял ваши таблицы «C» и «D» и «Pre-Aggregated» эти подсчеты основаны на столбце объединения. Таким образом, каждый из них будет иметь только 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, наверняка это помогло, и это сработало для некоторых из них, но все же дает мне неправильный результат для включения 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, даст мне ошибку: «Столбец» PreAggD.DCount ' недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. " знаете ли вы, как я могу его решить? –

+0

@ user12321 Добавьте 'PreAggC.X_Programp, PreAggD.DCount' в свою' GROUP BY' часть;). –

Смежные вопросы