Я сделал некоторые предположения относительно фактической структуры ваших таблиц, но если я пойму, что вы ищете, то я думаю, что этот запрос даст желаемые результаты.Возможно, вам придется внести несколько изменений, чтобы соответствовать структурам вашей таблицы.
SELECT
matches.UserName,
CAST(matches.SameRatings AS FLOAT) / CAST(ratings.UserRatingCount AS FLOAT) AS MatchPercent
FROM
tbl_User
CROSS APPLY
(
SELECT
COUNT(*) UserRatingCount
FROM
tbl_MemberAssociation
WHERE
UserId = tbl_User.UserId
) ratings
CROSS APPLY
(
SELECT
u1.UserId,
u1.UserName,
COUNT(*) AS SameRatings
FROM
tbl_MemberAssociation ma
INNER JOIN
tbl_MemberAssociation ma1
ON
ma.ImageId = ma1.ImageId
AND ma.Rating = ma1.Rating
AND ma.UserId <> ma1.UserId
INNER JOIN
tbl_User u1
ON
ma1.userId = u1.UserId
WHERE
ma.UserId = tbl_User.UserId
GROUP BY
u1.UserId,
u1.UserName
) matches
WHERE
tbl_User.UserId = @UserId
ORDER BY
MatchPercent DESC
@ UserId может быть передан в качестве входных данных для хранимой процедуры.
1-е "ПРИЛОЖЕНИЕ КРЕСТА" "оценки"получение подсчета для общего количества оценок для вошедшего в систему пользователя.
2-е ПРИЛОЖЕНИЕ CROSS "совпадения" - это подсчет количества одинаковых оценок для других пользователей в базе данных.
В результирующем наборе используется число, рассчитанное по двум запросам CROSS APPLY, для вычисления процента совпадения между вошедшим в систему пользователем и другими пользователями, которые оценили те же изображения, что и вошедший в систему пользователь.