Well where to start.
Your query may work but it is dificult to check without all of the other stuff around it (tables, data, stuff like that).
To check the code I expanded it to use a UNION ALL and split the command into a query that deals with the special points and another that does the normal points. On top of these two is a query that groups, merges and orders the resultant data. Will this work? I've no idea. I have nothing to test it on.
So cut and paste this into a query analyser window and run it. At least you will be able to test the individual parts of the query and thus find the problem
SELECT X.CLIENT AS CLIENT,
SUM(X.ACTUAL_POINTS) AS ACTUAL_POINTS,
SUM(X.NORMAL_AMMOUNT) AS NORMAL_AMMOUNT,
SUM(X.SPECIAL_AMMOUNT) AS SPECIAL_AMMOUNT,
SUM(X.TOTAL_AMMOUNT) AS TOTAL_AMMOUNT,
SUM(X.NORMAL_POINTS) AS NORMAL_POINTS,
SUM(X.SPECIAL_POINTS) AS SPECIAL_POINTS,
SUM(X.TOTAL_POINTS) AS TOTAL_POINTS,
SUM(X.EXCHANGED_POINTS) AS EXCHANGED_POINTS
FROM (SELECT
C.NAME AS CLIENT,
SUM(INVOICE.POINTS) - SUM(EXCHANGE.TOTALPOINTS) AS ACTUAL_POINTS,
0 AS NORMAL_AMMOUNT,
SUM(I.AMMOUNT) AS SPECIAL_AMMOUNT,
SUM(I.AMMOUNT) AS TOTAL_AMMOUNT,
0 AS NORMAL_POINTS,
SUM(INVOICE.POINTS) AS SPECIAL_POINTS,
SUM(INVOICE.POINTS) AS TOTAL_POINTS,
SUM(EXCHANGE.TOTALPOINTS) AS EXCHANGED_POINTS
FROM CLIENT C,
INVOICE I,
EXCHANGE E
WHERE C.ID = I.IDCLIENT
AND I.IS_SPECIAL_PROMO = TRUE
AND C.ID = E.IDCLIENT
AND C.IDPROMO = 1
-- I replace "1" by :PARAM_ID_NORMALPROMOTION
UNION ALL
SELECT
C.NAME AS CLIENT,
SUM(INVOICE.POINTS) - SUM(EXCHANGE.TOTALPOINTS) AS ACTUAL_POINTS,
SUM(INVOICE.AMMOUNT) AS NORMAL_AMMOUNT,
0 AS SPECIAL_AMMOUNT,
SUM(I.AMMOUNT) AS TOTAL_AMMOUNT,
SUM(I.POINTS) AS NORMAL_POINTS,
0 AS SPECIAL_POINTS,
SUM(INVOICE.POINTS) AS TOTAL_POINTS,
SUM(EXCHANGE.TOTALPOINTS) AS EXCHANGED_POINTS
FROM CLIENT C,
INVOICE I,
EXCHANGE E
WHERE C.ID = I.IDCLIENT
AND I.IS_SPECIAL_PROMO = FALSE
AND C.ID = E.IDCLIENT
AND C.IDPROMO = 1) X
-- I replace "1" by :PARAM_ID_NORMALPROMOTION
GROUP BY X.NAME, X.ACTUAL_POINTS
ORDER BY X.NAME
Finally I cannot stress the importance of correctly formated code. I don't care which standard you adhere to as long as the code is indented. It makes the code MUCH easier to read for others and for yourself after a couple of months have past since you last looked at it
Final Final note.
I've just read this back AFTER posting it. All my lovely indentation is gone. So cut and paste the code, work on it a bit and it should do what you want.