안녕하십니까
sp작성하다가 궁금한게 생겨서 문의글 올립니다.
예를들어 테이블에
품번 갯수
a 3
b 2
이렇게 저장되있을 때
이걸 a의 개수와 b의 개수대로 임시순번과 함께 출력하는 방법이 궁금합니다
예컨데
품번 갯수 임시순번
a 1 1
a 1 2
a 1 3
b 1 4
b 1 5
그리고
품번 갯수 임시순번
a 1 1
a 1 2
a 1 3
b 1 1
b 1 2
이렇게 두가지 방법에 대해 계속 생각해보고 짜보고 있는데
도저히 모르겠어서 문의드립니다..
Comment 7
-
성난큰곰(김민수)
2014.02.26 10:01
-
하하하하하
2014.02.26 15:00
안녕하세요
검색도 해보고 해서
-- 테이블, 생성
DECLARE @a TABLE ( 품번 CHAR(3), 갯수 INT)
DECLARE @b TABLE ( 임시순번 INT, 품번 CHAR(3), 갯수 INT)
DECLARE @I INT
DECLARE @J INT-- A 테이블에 입력
INSERT INTO @a VALUES ('a',3)
INSERT INTO @a VALUES ('b',2)-- A 테이블의 갯수만큼 B테이블에 입력
SET @I =(SELECT MAX(갯수) FROM @a)
SET @J=1
WHILE @J <= @I
BEGININSERT INTO @b
SELECT ISNULL((SELECT MAX(임시순번) FROM @b),0) + ROW_NUMBER() OVER (ORDER BY 품번), 품번, 1
FROM @a
WHERE 갯수>=@JSET @J=@J+1
END
-- 결과 조회
SELECT * FROM @a
SELECT * FROM @b이렇게 하면 a, b가 번갈아서 나오는데 이걸 어떻게 고쳐야 a 전부 나오고 b 전부 나올 수 있을까요?
그리고 전체에 대한 순번과
각 품번별 순번을 별도로 매기고 싶은데 모르겠습니다..
-
하하하하하
2014.02.26 15:01
아 저걸 조회하면
임시순번 품번 갯수
1 a 1
2 b 1
3 a 1
4 b 1이렇게 나옵니다..
5 a 1 -
성난큰곰(김민수)
2014.02.26 15:23
WHILE 문 돌리실때 그럼 임시품번 넣으시지 말구요 나중에 조회할때
SELECT *,ROW_NUMBER() OVER(ORDER BY 품번) 임시순번 FROM @b
SELECT *,ROW_NUMBER() OVER(PARTITION BY 품번 ORDER BY 품번) 임시순번 FROM @b해보세요 -
하하하하하
2014.02.26 15:29
처음에 달아주신 댓글을 제가 절반만 읽어서..
무조건 insert해야하는줄 알았습니다.
나중에 row_number 쓰는것으로 해결했습니다.
감사합니다.
-
건우아빠
2014.02.26 17:06
다른 방법으로 cross apply를 이용.
with res
as (
select 'a' [품번] ,3 [갯수] union all
select 'b' ,2
)
select a.[품번]
, 1 [갯수]
, b.no [임시군번1]
, ROW_NUMBER() over( order by a.[품번] , b.no ) [임시군번2]
from res a
cross apply
(
select number+1 no from master.dbo.spt_values where type = 'P' and number < a.[갯수]
) b -
하하하하하
2014.02.27 09:16
아 이런 방법도 있었군요.. 감사합니다^^
해당 테이블의 품번과 갯수를 받아서 갯수만큼 WHILE 문으로 갯수만큼 임시테이블 이나 테이블 변수 만들어서 INSERT 하면 될꺼같은데요?
임시 순번은 임시 테이블에 INSERT 할때 카운트로 넣어도 되고
아니면 다넣고나서 ROW_NUMBER() 함수 쓰고 아래 꺼는 ROW_NUMBER() OVER(PARTITION BY 품번 ORDER BY 품번) 이런식으로 ㅎ