table1에 수금할 내용은 다음과 같은데(특정 규칙은 없읍니다)
no Suip
1 100,000
2 55,000
3 100,000
4 33,000
5 11,000
예를 들어
133,000원이 입금되었다면 1번(100,000중 최초) , 4번(33,000중 최초)을 선택하고
44,000원이 입금되었다면4번 과 5번을 선택하고
255,000원이 입금되었다면1번 과 2번, 3번을 선택하고
160,000원이 입금되었다면 아무것도 선택하지 않도록
레코드를 선택하는 쿼리작성이 궁금합니다. While문을 사용해야 할 듯한데 까마득하기만 합니다.
제현의 하교를 부탁드립니다
Comment 4
-
건우아빠
2017.04.22 15:00
-
길주석
2017.04.22 17:23
건우부친님 감사드립니다. 정확한 답을 얻었습니다
몇년 전에도 도움받은 기억이 나는데...
그렇지만 경우의 수는 어렵군요. 공부좀 해야겠습니다.
강녕하시길.......
-
길주석
2017.05.02 00:33
염치없지만 다시 질문합니다
188,000원이 수금되면 SELECT 결과가 1,2,4 세개의 행을 나타내도록 하고싶습니다.
-
건우아빠
2017.05.02 13:25
구분자로 검색하시면 많은 질답이 나옵니다..함수를 만들어 놓고 사용하시는 방법이 좋을듯 합니다.http://www.sqler.com/141578http://www.sqler.com/140487 쿼리-> 이걸 테이블 함수로 만드시다음 이용하셔도 좋을듯...http://www.sqler.com/145575 스칼라함수이용
경우의수로 수금조합을 먼저 만들고 ( nPr ) 조회하시면 됩니다.
http://www.sqler.com/863670 참고
DECLARE @TB_LIST TABLE
(
num varchar
, Suip INT
)
INSERT INTO @TB_LIST VALUES (1, 100000)
INSERT INTO @TB_LIST VALUES (2, 55000)
INSERT INTO @TB_LIST VALUES (3, 100000)
INSERT INTO @TB_LIST VALUES (4, 33000)
INSERT INTO @TB_LIST VALUES (5, 11000)
declare @num as int , @Suip as numeric
;set @Suip = 160000
;set @num = (select count(*) from @TB_LIST);
;
with T (num, Suip, level) as (
select convert(varchar, num), Suip , level = 1 from @TB_LIST
union all
select convert(varchar,a.num+','+T.num),a.Suip+T.Suip Suip , level+1
from @TB_LIST a,T
where level < @num
and t.num > a.num
and charindex(a.num,T.num) = 0
)
select num , Suip
from T
where Suip = @Suip
order by Suip, level, num
;