Подсчет в ‘in’ SQL Server

#sql #sql-server #sql-in

#sql #sql-сервер #sql-in

Вопрос:

У меня проблема с:

 select  UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی' 
from UsersInfo 
where UsersInfo.MemberID in (
    select COUNT(ToLend.UserID), ToLend.UserID  'تعداد کتاب های قرض گرفته'  
    from ToLend
    inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
    group by UserID
    having count(UserID) > 2
)
  

Ошибка:

В списке выбора может быть указано только одно выражение, если подзапрос не введен с помощью EXISTS.

Как в этом коде можно «считать» для идентификатора пользователя?

Комментарии:

1. Что вы пытаетесь сделать? Примеры данных и желаемые результаты помогут прояснить ваш вопрос.

2. При использовании IN и подзапроса подзапрос должен возвращать только один столбец, например: SELECT * FROM TABLE1 WHERE ID IN (SELECT ID2 FROM TABLE2)

3. Удалите COUNT(ToLend.UserID), .

Ответ №1:

Вы хотите, чтобы внутренний select возвращал идентификатор пользователя. Зачем тогда вы добавляете count()?

 select  UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی' 
from UsersInfo 
where UsersInfo.MemberID in (
    select ToLend.UserID  'تعداد کتاب های قرض گرفته'  
    from ToLend
    inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
    group by UserID
    having count(UserID) > 2
)
  

Является ли MemberID уникальным ключом в UsersInfo?
Если это так, вы можете изменить свой запрос на:

 select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی' 
from UsersInfo 
where (select count()
         from ToLend
         where ToLend.UserID = UsersInfo.MemberID
      ) > 2
  

ОБНОВЛЕНИЕ: чтобы получить count() в выходных данных:

 select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی' , count()
  from UsersInfo 
 inner join ToLend
 where ToLend.UserID = UsersInfo.MemberID
 group by UsersInfo.MemberID, UsersInfo.fName, UsersInfo.lName
having count() > 2
  

Мне пришлось добавить UsersInfo.MemberID в группу by, поскольку я не уверен, что комбинация fName lName уникальна. Если это так, вы можете исключить UsersInfo.MemberID из группы by.

Комментарии:

1. вау, это намного короче, чем у меня. спасибо, братан, но мой вопрос о другом, я хочу показать счетчик идентификатора пользователя с помощью функции подсчета в отдельном столбце

Ответ №2:

Если вы хотите знать, какому пользователю предоставлено > 2, вы можете удалить COUNT(добавить.Идентификатор пользователя) в подзапросе. И если вы хотите знать, сколько раз предоставляется, вы можете добавить подзапрос в select

 select  UsersInfo.fName 'نام', 
        UsersInfo.lName 'نام خانوادگی',
        (select COUNT(UserID)
         from ToLend
         where UserID = UsersInfo.MemberID
         group by UserID
         having count(UserID) > 2) 'Lended count'
from UsersInfo 
where UsersInfo.MemberID in (
    select ToLend.UserID  'تعداد کتاب های قرض گرفته'  
    from ToLend
    inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
    group by UserID
    having count(UserID) > 2
)
  

Комментарии:

1. да-а-а-а, очень, очень спасибо, Эмануэле леони, я очень хочу этот outputer извините, не могли бы вы, пожалуйста, объяснить свой код, я не понимаю, как это работает, спасибо, брат

2. Привет @rezatajari, рад вам помочь. (выберите COUNT(userId) из ToLend …) в SELECT возвращает количество предоставленных UsersInfo > 2. Этот подзапрос необходим, потому что вы не можете получить эти данные только в одном запросе. Дайте мне знать, если я ответил на ваш вопрос.

3. Да, братан, теперь я понял, что ты имеешь в виду, большое спасибо./

Ответ №3:

Вы можете просто изменить свой код, как показано ниже

 SELECT UsersInfo.fName 'نام'
    ,UsersInfo.lName 'نام خانوادگی'
    ,a.UserId 'تعداد کتاب های قرض گرفته'
    ,a.[cnt]
FROM UsersInfo u
JOIN (
    SELECT COUNT(ToLend.UserID) [cnt]
        ,ToLend.UserID
    FROM ToLend
    INNER JOIN UsersInfo ON ToLend.UserID = UsersInfo.MemberID
    GROUP BY UserID
    HAVING count(UserID) > 2
    ) a ON a.UserID = u.MemberId