Ponieważ teraz mnożysz wyniki, najpierw musimy zdecydować, jaki jest wynik, jeśli żaden z kodów nie zostanie dopasowany. Przypuszczam, że powinno być 0. Następnie powinniśmy rozbić wszystkie możliwe kody na niezależne grupy, czyli takie, których wyniki nie zależą od innych członków grupy. Oto one (1,2,4) i (8). I zdefiniuj zasady dla każdej grupy. Więc
SELECT [id] ,[name],r =
-- At least one of values needed to get score > 0
MAX(CASE WHEN code IN (1,2,4, 8) THEN 1.0 ELSE 0.0 END) *
-- Now rules for every independent set of codes. Rule should return score if matched or 1.0 if not matched
-- (1,2,4)
coalesce(MAX(CASE WHEN [code] IN (1,2,4) THEN 0.70 END), 1.0 ) *
-- (8)
coalesce(MAX(CASE WHEN [code] IN (8) THEN 0.75 END), 1.0)
-- more ?
FROM (values (1, 'ali',4)
,(1, 'ali',1)
,(1, 'ali',8)
,(1, 'ali',2)
,(2, 'sunny',1)
,(4, 'arslan',4)) as t(id, name,code)
GROUP BY id, name;