Erreur SQL "Impossible d'exécuter une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête."

J'exécute cette requête dans Oracle. J'ai ajouté les captures d'écran de mes données et les résultats returnnés mais le résultat returnné est faux. Il revient 1 mais il devrait returnner 0.52. Parce que le client (voir dans la capture d'écran ci-joint) ont des codes 1,2,4,31 et pour 1,2,4 il devrait get une valeur de 0,70 et pour 31 il devrait get 0,75 et après multiplication le résultat returnné devrait être 0,52 au lieu de 1 Je suis vraiment coincé ici. Aidez-moi, s'il vous plaît. Je serai très reconnaissant envers vous.

Voici ma requête. Ce que je veux réellement faire, c'est que je veux calculer la valeur des points donnés à chaque client sur la base des codes qu'ils ont obtenus.

Si un client a le code = 1 alors il obtiendra 0.70 points et s'il a aussi le code = 2 et 4 alors je ne veux pas lui donner 0.70 supplémentaire pour le code 2 et 4.

Laisse-moi être simple. Si un client a tous ces codes 1, 2, 4, il ne recevra que 0,70 points pour une fois, mais s'il n'a que le code 4, il obtiendra 0,90, mais s'il obtient le code 31, il recevra 0,75 ayant le code 31. Cela a-t-il un sens maintenant?

SELECT RM_LIVE.EMPLOYEE.EMPNO, RM_LIVE.EMPNAME.FIRSTNAME, RM_LIVE.EMPNAME.LASTNAME, RM_LIVE.CRWBASE.BASE ,RM_LIVE.CRWCAT.crwcat AS "Rank", nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (29,721) THEN 0.25 ELSE 1 END),0),1) * nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (31,723) THEN 0.75 ELSE 1 END),0),1) * nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC = 861 THEN 0.80 ELSE 1 END),0),1) * nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (17,302,16) THEN 0.85 ELSE 1 END),0),1) * nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (3,7) THEN 0.90 ELSE 1 END),0),1)* nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (921,301,30,722,601,581) THEN 0.50 ELSE 1 END),0),1) * nvl(nullif(MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (2,1, 4) THEN 0.70 ELSE 1 END),0),1) * nvl(nullif(MIN(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (1,2) then 0 else 1 END) * MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (4) then 0.20 else 0 END),0),1) AS "FTE VALUE" FROM RM_LIVE.EMPBASE, RM_LIVE.EMPLOYEE, RM_LIVE.CRWBASE, RM_LIVE.EMPNAME, RM_LIVE.CRWSPECFUNC, RM_LIVE.EMPSPECFUNC,RM_LIVE.EMPQUALCAT,RM_LIVE.CRWCAT where RM_LIVE.EMPBASE.IDEMPNO = RM_LIVE.EMPLOYEE.IDEMPNO AND RM_LIVE.EMPBASE.IDCRWBASE = RM_LIVE.CRWBASE.IDCRWBASE AND RM_LIVE.EMPLOYEE.IDEMPNO = RM_LIVE.EMPNAME.IDEMPNO AND RM_LIVE.EMPSPECFUNC.IDCRWSPECFUNC =RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC AND RM_LIVE.EMPSPECFUNC.IDEMPNO =RM_LIVE.EMPLOYEE.IDEMPNO AND RM_LIVE.EMPQUALCAT.IDEMPNO=RM_LIVE.EMPLOYEE.IDEMPNO AND RM_LIVE.CRWCAT.IDCRWCAT = RM_LIVE.EMPQUALCAT.IDCRWCAT AND RM_LIVE.CRWCAT.crwcat IN ('CP','FO','CM','MC') AND RM_LIVE.CRWBASE.BASE <> 'XYZ' AND RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN ('921','2' ,'1','301','17','4','3','7','302' ,'861','31', '723','30','722 ','29 ','721','16','601','581') AND RM_LIVE.EMPBASE.STARTDATE <= SYSDATE AND RM_LIVE.EMPBASE.ENDDATE >= SYSDATE AND RM_LIVE.EMPSPECFUNC.STARTDATE <= SYSDATE AND RM_LIVE.EMPSPECFUNC.ENDDATE >= SYSDATE AND RM_LIVE.EMPNAME.FROMDATE <=SYSDATE AND RM_LIVE.EMPQUALCAT.STARTDATE <= SYSDATE AND RM_LIVE.EMPQUALCAT.ENDDATE >= SYSDATE GROUP BY RM_LIVE.EMPLOYEE.EMPNO, RM_LIVE.EMPNAME.FIRSTNAME, RM_LIVE.EMPNAME.LASTNAME, RM_LIVE.CRWBASE.BASE,RM_LIVE.CRWCAT.crwcat; 

Mes données Résultats retournés

Selon le commentaire souhaité, essayez ceci

 SELECT [id] ,[name] , r = max(CASE WHEN [code] IN (1,2,4) then 100 else 0 end) + max(CASE WHEN [code] IN (8) then 80 else 0 end) FROM -- your table here (values (1, 'ali',4) ,(1, 'ali',1) ,(1, 'ali',8) ) as t(id, name,code) GROUP BY id, name; 

EDIT une autre histoire pour exclure quelque chose. N'importe lequel de 1,2,4 donne 100 plus si c'était seulement 4 sans (1,2) append 400.

 SELECT [id] ,[name] , r = max(CASE WHEN [code] IN (1,2,4) then 100 else 0 end) + min(CASE WHEN [code] IN (1,2) then 0 else 1 end) * max(CASE WHEN [code] IN (4) then 400 else 0 end) + max(CASE WHEN [code] IN (8) then 80 else 0 end) FROM -- your table here (values (1, 'ali',4) ,(1, 'ali',1) ,(1, 'ali',8) ,(2, 'ali',4) ,(2, 'ali',8) ) as t(id, name,code) GROUP BY id, name; 

EDIT 2 Si vous avez besoin de multiplier les scores, remplacez + par * et convertissez 0 en 1.

 SELECT [id] ,[name] ,r = isnull(nullif( max(CASE WHEN [code] IN (1,2,4) then 100 else 0 end) ,0),1) * isnull(nullif( min(CASE WHEN [code] IN (1,2) then 0 else 1 end) * max(CASE WHEN [code] IN (4) then 400 else 0 end) ,0),1) * isnull(nullif( max(CASE WHEN [code] IN (8) then 80 else 0 end) ,0),1) FROM -- your table here (values (1, 'ali',4) ,(1, 'ali',1) ,(1, 'ali',8) ,(2, 'ali',4) ,(2, 'ali',8) ) as t(id, name,code) GROUP BY id, name; 

Vous avez manqué une virgule (,) avant de calculer la sum.

Donc, votre code devrait être:

 SELECT [id] ,[name] ,SUM(CASE WHEN (SELECT [code] FROM [Test].[dbo].[testcode] as ts WHERE ts.id = t.id) IN (1,2,4) then 100 else 10 end) as "total" FROM [Test].[dbo].[testcode] as t GROUP BY id, name 

Vous êtes déjà en train de sélectionner dans la table testcode – pas besoin de faire de sous-requêtes dans votre expression CASE – utilisez simplement ce code:

 SELECT [id], [name], SUM(CASE WHEN [code] IN (1, 2, 4) THEN 100 WHEN [code] = 8 THEN 80 END) AS [total] FROM [Test].[dbo].[testcode] AS t GROUP BY id, name