Só brincando mais um pouco
CREATE FUNCTION ze_AliquotaIcms( cUFde VARCHAR(2), cUFate VARCHAR(2) )
RETURNS DECIMAL(10,2)
BEGIN
DECLARE nAliquota DECIMAL(10,2);
SET nAliquota = (
CASE
WHEN cUFde = cUFate AND cUFde IN ( 'AL', 'AM', 'AP', 'BA', 'CE',
'DF', 'ES', 'MA', 'MG', 'PB', 'PE', 'PI', 'PR', 'RN', 'RS',
'SP', 'SE', 'TO' ) THEN 18
WHEN cUFde = cUFate AND cUFde IN ( 'GO', 'MT', 'MS', 'PA', 'RO',
'RR', 'SC' ) THEN 17
WHEN cUFde = 'AC' AND cUFate = 'AC' THEN 12
WHEN cUFde = 'MG' AND cUFate IN ( 'PR', 'RJ', 'RS', 'SC', 'SP' ) THEN 12
WHEN cUFde = 'MG' THEN 7
WHEN cUFde = 'RJ' AND cUFate = 'RJ' THEN 20
WHEN cUFde = 'RJ' AND cUFate IN ( 'MG', 'PR', 'RS', 'SC', 'SP' ) THEN 12
WHEN cUFde = 'RJ' THEN 7
WHEN cUFde = 'RS' AND cUFate IN ( 'MG', 'PR', 'PR', 'MS', 'SC', 'SP' ) THEN 12
WHEN cUFde = 'SC' AND cUFate IN ( 'MG', 'PR', 'MS', 'PB', 'RS', 'SP' ) THEN 12
WHEN cUFde = 'SC' then 7
WHEN cUFde = 'SP' AND cUFate IN ( 'MG', 'PR', 'RJ', 'RS', 'SC' ) THEN 12
WHEN cUFde = 'SP' THEN 7
ELSE 12
END );
RETURN nAliquota;
END
AÃ fica bem claro como eu agrupei.
O adicional é pra comparação UFde = UFate, que pega as alÃquotas internas.