[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(varchar, Cast(((@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(int, convert(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
'프로그램ing > MSSQL' 카테고리의 다른 글
[MSSQL] 백업 스케쥴 생성 (0) | 2021.07.02 |
---|---|
[MS-SQL] 기존 테이블 디자인으로 임시테이블 만들기 (0) | 2020.08.07 |
[MSSQL] BULK INSERT 시 필드종결자와 행종결자 에러 (0) | 2019.08.09 |
MSSQL Database. IP주소 문자열 정렬하기 (0) | 2017.07.13 |
댓글