2010-04-22 4 views

답변

1

SQL은 반복 루프에 실제로 적합하지 않습니다. 나는이 ... 음, 당신이 다른 언어로 자신에 대한 몇 가지 예제 코드에 링크 된 것 거기에서

select * from `brackets` where `tier` < $income 

을 것입니다. 당신은 정말로 그렇게해야합니다. 당신이 그렇지 않으면 주장하는 경우

, SQL은 그것을 할 수 있습니다 :

DELIMITER $$ 
create procedure `calcTax`(IN v_param1 int) 

begin 
declare v_tier int; 
declare v_rate decimal(3,3); 
declare v_untaxed int default 0; 
declare v_taxTotal float default 0; 

set v_untaxed = v_param1; 
set v_taxTotal = 0; 

while v_untaxed > 0 do 
select max(`tier`), max(`rate`) into v_tier, v_rate 
    from `brackets` where tier < v_untaxed order by `tier` desc limit 1; 

set v_taxTotal = v_taxTotal + (v_untaxed - v_tier) * v_rate; 
set v_untaxed = v_tier; 
end while; 

select v_taxTotal; 
end; 
$$ 

올바른 데이터 유형은 당신에게 달려 있습니다. 밖으로 나가는 세금 대괄호 테이블이 필요합니다. 아래 테스트를 위해 하나를 만들었습니다 (잘못 알려준 데이터 유형으로).

create table brackets (tier int primary key, rate float); 
insert into brackets values (0, 0), (10000, 0.1), (50000, 0.2); 
+0

응답 해 주셔서 감사합니다. 이것은 올바른 방향으로 나아가는 단계입니다. 값의 행 (가격 등)이있는 테이블에서이 작업을 실행할 수 있기를 바랬습니다. 계층은 동적이며 쿼리와 함께 전달됩니다. 이것은 반대의 접근법을 취하는 것처럼 보입니까? – CrashRoX

+0

그런 다음 조회 할 값이있는 임시 테이블을 만들고이 테이블 이름을 두 번째 매개 변수로 쿼리에 전달하여이 문제를 해결할 것을 제안합니다. 내가 가진 것을 가지고 가서 거기에서 일할 수 있어야합니다. 나는 왜 당신이 데이터베이스에 계산 작업에 중점을두고 이것을하고 있는지에 대해 매우 궁금합니다. –

+0

나는 코드 버전을 고집했다. 당신이 옳았고 그것이 가장 합리적이었습니다. 시간과 제안에 감사드립니다. – CrashRoX