Сумма SQL Server, возвращающая неверное число - PullRequest
0 голосов
/ 15 июня 2019

Я использую LEFT JOIN три раза в запросе для отображения информации о пользователе. По какой-то причине второй последний LEFT JOIN влияет на вывод функции SUM.

Я попытался удалить второй последний оператор LEFT JOIN, который возвращает правильное значение. Я не понимаю, почему это изменит значение.

SELECT 
    [tbl_users].[id],
    [username],
    COUNT([tbl_password_resets].[id]) as passwordresets,
    SUM(CASE WHEN [tbl_files].[user_id] = [tbl_users].[id] THEN 1 ELSE 0 END) as uploads,
    COUNT([tbl_downloads].[id]) as downloads,
    CAST(SUM(CASE WHEN [tbl_downloads].[liked] = 1 OR [tbl_downloads].[disliked] = 1 THEN 1 ELSE 0 END) AS FLOAT) / NULLIF(COUNT([tbl_downloads].[id]), 0) as ratio,
    [ban]
FROM 
    [tbl_users]
LEFT JOIN 
    [tbl_password_resets] ON [tbl_users].[id] = [tbl_password_resets].[user_id]
LEFT JOIN 
    [tbl_downloads] ON [tbl_users].[id] = [tbl_downloads].[user_id]
LEFT JOIN 
    [tbl_files] ON [tbl_files].[user_id] = [tbl_users].[id]
GROUP BY 
    [tbl_users].[id], [tbl_users].[username], [tbl_users].[ban]

Результат для загрузки - 9 вместо 3.

1 Ответ

1 голос
/ 16 июня 2019

Если какая-либо объединенная таблица дублирует строки, это влияет на результат COUNT и SUM. Закомментируйте агрегаты, GROUP BY и JOIN для тестирования и посмотрите, что произойдет с количеством строк, когда вы создаете запрос, добавляя JOIN один за другим. Чем больше строк попадает в одну группу, тем больше значений будет СЧИТАЕТСЯ и СУММА.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...