Функция SQL GROUP BY, возвращающая неправильную сумму суммы - PullRequest
0 голосов
/ 26 апреля 2018

Я работал над этой проблемой, изучая, что я могу делать неправильно, но я не могу найти ответ или ошибку в коде, который я написал. В настоящее время я извлекаю данные из базы данных MS SQL Server с предложением WHERE, которое успешно фильтрует результаты в соответствии с тем, что я хочу. Я получаю примерно 4 строки на сотрудника и хочу добавить столбец значений. В тот момент, когда я добавляю предложение GROUP BY к идентификатору сотрудника и добавляю SUM к значению, я получаю число, которое совершенно неверно. Я подозреваю, что код SQL игнорирует мое предложение WHERE.

Ниже приведен небольшой выбор данных:

hr_empl_code    hr_doll_paid
1               20.5
1               51.25
1               102.49
1               560

Я ожидаю, что предложения GROUP BY и SUM дадут мне значение 734.24. Мне дано значение 211461.12. Благодаря устранению неполадок я добавил в свой запрос столбец COUNT (*), чтобы определить количество строк, с которыми он работает, и он дает результат 1152, что еще больше укрепляет мою уверенность в том, что он игнорирует мое предложение WHERE.

Мой код SQL такой, как показано ниже. Большинство из них было сгенерировано интерфейсным приложением, из которого я его запускаю, так что там есть некоторый дополнительный код, который, как мне кажется, помогает при выполнении запроса.

SELECT DISTINCT
    T000.hr_empl_code,
    SUM(T175.hr_doll_paid)
FROM 
    hrtempnm T000,
    qmvempms T001,
    hrtmspay T166,
    hrtpaytp T175,
    hrtptype T177
WHERE   1 = 1 
AND T000.hr_empl_code = T001.hr_empl_code
AND T001.hr_empl_code = T166.hr_empl_code
AND T001.hr_empl_code = T175.hr_empl_code
AND T001.hr_ploy_ment = T166.hr_ploy_ment
AND T001.hr_ploy_ment = T175.hr_ploy_ment
AND T175.hr_paym_code = T177.hr_paym_code
AND T166.hr_pyrl_code = 'f' AND T166.hr_paid_dati = 20180404
AND (T175.hr_paym_type = 'd' OR T175.hr_paym_type = 't')
GROUP BY T000.hr_empl_code
ORDER BY hr_empl_code

Я действительно потерян, где это может пойти не так. Я удалил дополнительное WHERE и уменьшил его до T166.hr_empl_code = T175.hr_empl_code, но это не изменило.

Я ни в коем случае не являюсь экспертом в области SQL Server и запросов, но я достаточно хорошо разбираюсь в этой технологии. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 26 апреля 2018

Группировка не так, как вы используете это неправильно.

SELECT 
    T000.hr_empl_code,
    T.totpaid
FROM 
    hrtempnm T000
inner join (SELECT 
    hr_empl_code,
    SUM(hr_doll_paid) as totPaid
FROM 
    hrtpaytp T175
where hr_paym_type = 'd' OR hr_paym_type = 't'
GROUP BY hr_empl_code
) T on t.hr_empl_code = T000.hr_empl_code
where exists
   (select * from qmvempms T001,
    hrtmspay T166,
    hrtpaytp T175,
    hrtptype T177
WHERE  T000.hr_empl_code = T001.hr_empl_code
AND T001.hr_empl_code = T166.hr_empl_code
AND T001.hr_empl_code = T175.hr_empl_code
AND T001.hr_ploy_ment = T166.hr_ploy_ment
AND T001.hr_ploy_ment = T175.hr_ploy_ment
AND T175.hr_paym_code = T177.hr_paym_code
AND T166.hr_pyrl_code = 'f' AND T166.hr_paid_dati = 20180404
)
ORDER BY hr_empl_code

Примечание: было бы более понятно, если бы вы использовали соединения вместо соединения в старом стиле, где.

...