테이블내에 데이터(숫자)를 분할하는 것 0 15 4,732

by 감사 [SQL Query] CONNECT BY UNION [2014.12.12 11:13:25]


상품 A - 10  - 15

라는 테이블을

상품 A - 10 - 10

상품 A - 10 - 5

로 나타내고 싶습니다.

A상품의 15를 10과 5로 나누고 싶습니다.

부탁드립니다.

 

 

by 아발란체 [2014.12.12 11:17:43]

1개 테이블을 1개 이상 테이블로 분할 한다는 내용인가용? @.@)?


by 감사 [2014.12.12 11:21:11]

넵!!

 

상품  수 수

a      10  15

상품 수 수

a     10  10

a     10   5

로 바꾸고싶습니다!1

아래처럼 새로운 행이 추가 되면서 15를 10과 5로 분할하려고 합니다.


by 아발란체 [2014.12.12 11:26:07]

음.. 이해 했습니다. 테이블 분할이 아니라 레코드(행) 분할이군용! ㅋ

근데 15를 10과 5로 나누는 기준이 뭐에용?

바로 이전 속성 값이 10이라, 그 값을 기준으로 넘치는 값을 추가 행으로 분할되는 것인가용?


by 감사 [2014.12.12 11:29:11]

넵 ㅠㅠ 아발란체님 말씀이 맞는 것 같습니다.

기준은 50개가 수량이면 레코드당 10이 5개로 분할이 되고 - 총 5개

45개면 레코드가 10이 4개 + 5가 1개로 분할됩니다. - 총 5개

그래서 15는 10이 1개 + 5가 1개 로 분할되는 것을 말합니다. -총 2개


by 아발란체 [2014.12.12 12:41:32]
WITH T AS (
  SELECT 'A' AS a, 10 AS b, 35 AS c FROM DUAL
)
SELECT a, b, c - ((LEVEL - 1) * 10) FROM T CONNECT BY LEVEL <= CEIL(c / 10) --신규 데이타 
UNION ALL  
SELECT 'B', 10, 5 FROM DUAL --기존 데이타

 


by 감사 [2014.12.12 13:14:04]

아발란체님 정말 감사합니다 많이 배우고 갑니다


by 마농 [2014.12.12 13:18:40]
WITH t AS
(
SELECT 'A' cd, 10 unit, 50 cnt FROM dual
UNION ALL SELECT 'B', 10, 45 FROM dual
UNION ALL SELECT 'C', 10, 15 FROM dual
UNION ALL SELECT 'D', 20, 50 FROM dual
)
SELECT cd
     , unit
     , cnt
     , LEAST(cnt - unit*(lv-1), unit)
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= CEIL(cnt / unit)
 ORDER BY cd, lv
;

 


by 감사 [2014.12.12 13:32:57]

미농님 정말  감사합니다! ㅜㅜ q&a 항상 배우고 있습니다.

특정단위로 레코드 분할은 언제나 least 구문을 사용하나요?


by 마농 [2014.12.12 13:37:53]

언제나, 반드시, 결코, 등등의 단어가 들어가면 보통 틀린 답이죠...

그때 그때 가장 적절하다 생각되는 함수를 사용합니다.

레코드 분할과 관련있는 키워드는 Least 가 아니라 Connect By Level 이죠.

Least 는 단지 계산식을 간략화하기 위해 사용되었을 뿐입니다.


by 감사 [2014.12.12 13:35:32]

그리고 with t as 구문은 join구문으로 대체할 수 있는 것인가요?ㅜㅜ


by 마농 [2014.12.12 13:40:14]

With 구문에 초점을 맞추실게 아닙니다.

With 는 단지 테이블 대신 사용한 것 뿐입니다. (저는 해당 테이블이 없으니까요)

쿼리를 어떤 방식으로 작성했는지에 초점을 맞추셔야죠.


by 감사 [2014.12.12 13:40:42]

WITH T AS 대신

SELECT * FROM ( ) A 값으로 묶어주어도 되나요?


by 감사 [2014.12.12 13:41:53]

네 미농님

ㅠㅠ 능력자분들이세요 최고!!

감사합니다


by 돌프 [2014.12.12 14:15:20]
SELECT prod, val1, val2
     , LEAST(val1, val2 - ((LEVEL -1) * val1)) 
  FROM (SELECT 'A' prod, 10 val1, 15 val2 FROM dual)
 CONNECT BY LEVEL <= CEIL(val2 / val1)

 


by 감사 [2014.12.12 14:18:40]

돌프님 가르쳐주셔서 정말 감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입