Omdat je nu scores vermenigvuldigt, moeten we eerst beslissen wat de score is als geen van de codes overeenkomt. Ik veronderstel dat het 0 moet zijn. Vervolgens moeten we alle mogelijke codes in onafhankelijke groepen splitsen, dat wil zeggen dat de resultaten niet afhankelijk zijn van andere groepsleden. Hier zijn ze (1,2,4) en (8). En definieer de regel voor elke groep.Dus
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;