본문 바로가기
프로그램ing/MSSQL

[MSSQL] 목표금액만큼 난수로 금액 나누기/채우기

by 철밥통 2019. 8. 29.
반응형

[MSSQL] 목표금액만큼 난수로 금액 나누기/채우기

 

 

안녕하세요, 이번에는 난수를 이용하여 목표금액을 정해놓고 그 금액만큼 난수로 금액을 나누는 쿼리입니다.
상세 설명은 주석을 달아 놓았고, 바로 복사해서 사용하셔도 되니, 복사하셔서 필요에 맞게 변형하여 사용해주시기 바랍니다.
감사합니다.




Declare @idx int, @beforeAmt int, @afterTotAmt int

Declare @totAmt int, @leftAmt int, @ranCnt int, @avgCnt int, @half1 int, @half2 int 
Declare @maxIdx int , @maxAmt int, @minIdx int, @minAmt int
Declare @maxRanValue int, @minRanValue int, @maxRanAmt int
Declare @dept_cd varchar(6)

set @beforeAmt = 7660000            -- 목표금액
set @maxRanValue = 299990          -- 최대금액
set @minRanValue = 100000           -- 최소금액
set @totAmt = 0                        -- 합계금액
set @idx = 0      


-- 임시 테이블 생성
create table #T_1(
   idx int,
   amt int
)

-- 합계 금액이 목표 금액보다 커지기 전까지 do while
while @totAmt < @beforeAmt
   begin      
      -- idx 채번
      set @idx = @idx + 1        

      -- 특정 난수 조건으로 10원 or 100원 단위까지 출력 여부 결정
      set @ranCnt = @idx % replace(right(round(Rand(), 1),1), 0, 1)
      if @ranCnt = 1
         begin
            -- 10원 단위까지 난수로 금액 산정
            set @maxRanAmt =  convert(int, left(convert(varchar, Cast(((@maxRanValue + 1) - @minRanValue) * Rand() + @minRanValue As int)), 5) + '0')
      end
      if @ranCnt <> 1
         begin
            -- 100원 단위까지 난수로 금액 산정
            set @maxRanAmt =  convert(int, left(convert(varcharCast(((@maxRanValue + 1) - @minRanValue) * Rand() + @minRanValue As int)), 4) + '00')
      end
     
      -- 합계 금액
      set @totAmt = @totAmt + @maxRanAmt     

      -- 데이터 임시 테이블에 입력
    insert into #T_1 (idx, amt) values(@idx, @maxRanAmt);
end

-- 결과 금액 세팅
select @afterTotAmt = sum(amt) from #T_1

-- 목표금액 - 결과금액 = 차액(@leftAmt)
set @leftAmt = @beforeAmt - @afterTotAmt

-- 차액(@leftAmt)과 테이블에 입력된 금액(amt)의 합계가 최소금액(@minRanValue) 보다 이상인 경우 체크.
select @avgCnt = count(idx) from #T_1 where amt + @leftAmt > @minRanValue;

-- 차액(@leftAmt)이 0보다 작은 음수 이면서, 차액 가감산시 최소금액보다 이상인 경우
if @leftAmt < 0 and @avgCnt > 0
   begin
      update top (1) #T_1 set amt = amt + @leftAmt where amt + @leftAmt > @minRanValue;
end

-- 차액(@leftAmt)이 0보다 작은 음수 이면서, 차액 가감산시 최소금액 조건을 지키지 못하는 경우
if @leftAmt < 0 and @avgCnt = 0
   begin
      -- 차액을 2로 나누어서 원단위 절삭 후 @half1 에 입력
      set @half1 = 

 

convert(intconvert(varchar, left(abs(@leftAmt) / 2, len(abs(@leftAmt / 2)) - 2)) + '00') * -1      -- 차액 - @half1 = @half2
      set @half2 = (abs(@leftAmt) - @half1) *  -1     
      -- 차액만큼 최소 금액 조건을 유지한채 적용
      update top (1) #T_1 set amt = amt + @half1 where amt + @half1 > @minRanValue;
      update top (1) #T_1 set amt = amt + @half2 where amt + @half2 > @minRanValue;
end

-- 차액이 0보다 큰 양수인 경우
if @leftAmt > 0
   begin
      -- 최대금액(@maxRanValue)을 넘기지 않는 조건에서 데이터 적용
      update top (1) #T_1 set amt = amt + @leftAmt where amt + @leftAmt < @maxRanValue;
end

 

select * from #T_1

반응형

댓글