2015-09-15 2 views
1

У меня есть таблица, и я хочу отображать только те отделы, в которых есть хотя бы один зарегистрированный пользователь. Мой запрос ниже:Где предложение с суммарной суммой в sql-запросе

SELECT departments.id as DepartmentID, 
     departments.depName as DepartmentName, 
     SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers 
FROM (myDB.departments) 
LEFT JOIN myDB.users ON departmentID=departments.id 
AND `departments`.`isDelete` = 0 
HAVING SUM(NumberOfUsers) >=0 

HAVING SUM(NumberOfUsers) >=0 не работает вообще. Я хотел бы проверить, является ли NumberOfUsers более чем одним, а затем отображать его, если не более одного, а затем не отображать его. Какие-либо предложения?

+0

Более одного из них: «ИМЕЕТ СУММУ (NumberOfUsers)> = 1' – Jens

+0

Уважаемый, это Sql Server или My Sql? –

+0

Ваша работа работает отлично, а не совсем. Вы просто написали это неправильно. Вы хотите> 0 и не> = 0. Кроме того, пользователи numbe rof уже суммированы, поэтому используйте HAVING NumberOfUsers> 0. Также группировка. также может выполнять внутреннее соединение и использовать там, где users.numberofusers> 0. – AdrianBR

ответ

0

В этом случае вам также необходимо использовать предложение group by.

SELECT departments.id as DepartmentID, 
     departments.depName as DepartmentName, 
     SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers 
FROM (myDB.departments) 
LEFT JOIN myDB.users ON departmentID=departments.id 
    AND `departments`.`isDelete` = 0 
GROUP BY departments.id, departments.depName 
HAVING SUM(IF(users.isDelete=0, 1, 0)) >=0 

Но если вы хотите более короткий ответ, вы можете использовать JOIN вместо LEFT JOIN и удаления HAVING пункта:

SELECT departments.id as DepartmentID, 
     departments.depName as DepartmentName, 
     SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers 
FROM (myDB.departments) 
JOIN myDB.users ON departmentID=departments.id 
    AND `departments`.`isDelete` = 0 
GROUP BY departments.id, departments.depName 
+0

здесь нужна сумма? может использовать count с предложением where isdelete? –

+0

@VishalJAIN Это тоже должно было сделать, но я старался как можно больше сохранить исходный код – Musa

+0

Спасибо. Это отлично работает – QWERTY

1

Попробуйте это:

SELECT departments.id as DepartmentID, 
     departments.depName as DepartmentName, 
     (SELECT COUNT(u.id) 
     FROM users u 
     WHERE u.departmentID = d.id) as NumberOfUsers 
FROM departments d 
WHERE d.isdelete = 0 
AND EXISTS 
    (SELECT 'user' 
    FROM users u 
    WHERE u.departmentID = d.id) 

Таким образом, вы не используете SUM в главном запросе (где вы должны использовать GROUP BY, чтобы показать другие скалярные поля, как departments.id и departments.depName В. Мой Sql не является обязательным. GROUP BY)

Сущность EXISTS гарантирует наличие хотя бы одного пользователя. Если вы хотите показать весь отдел (независимо от количества пользователей, удалите условие EXISTS)

+0

. Это кажется сложным, но я думаю, что это интересно. , – QWERTY

1

Я думаю, что можно упростить запрос, как вы проверяете условие в таблице пользователя, is_delete должно быть 0, поэтому нет необходимости в левом соединении, вы можете просто использовать обычное соединение. После этого вы удаляете все строки те не имеют записи, имея пункт, так что вы можете просто поставить это условие где п согласно ценам ниже

SELECT dpt.id AS DepartmentID, dpt.depName AS DepartmentName, 
COUNT(usr.id) AS NumberOfUsers 
FROM myDB.departments AS dpt 
JOIN myDB.users AS usr ON usr.departmentID=dpt.id 
WHERE dpt.`isDelete` = 0 AND usr.isDelete=0 

Примечание: Предположим, что таблицы пользователей имеют первичный ключ в качестве идентификатора, если не то вы можете использовать любой другой столбец в функции count.

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