쿼리 질문 드립니다. 0 11 1,406

by 소연짱 [SQL Query] [2013.08.29 16:42:58]




안녕하세요. 쿼리를 짜다가 도저히 몰라서

게시판 검색해도 비슷한건 있지만 적용해보니 안되서  질문 드립니다.



ce_id  mo_id   ord_id    ho_id
---------------------------------------------
wo03  model01  g200      A1
wo03  model01  g200      A2
wo03  model01  g200      A3
wo03  model01  g200      A4




출력결과

ce_id |  mo_id  | ord_id  |  ho1  |  ho2   |  ho3 |  ho4  |
-----------------------------------------------------------------------------------
wo03 | model01 | g200   |   A1  |    A2  |   A3  |  A4  |



ho_id 에 해당하는 row 만 행으로 변경 출력이 가능한지 궁금합니다.

고수님들의 도움 요청 드립니다.

 



by 우리집아찌 [2013.08.29 16:47:53]
 
WITH T ( ce_id , mo_id , ord_id , ho_id ) AS (
SELECT 'wo03' , 'model01' ,'g200' ,'A1' FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A2'FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A3'FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A4'FROM DUAL 
)

SELECT ce_id 
 , mo_id 
 , ord_id 
 , MAX(DECODE(ROWNUM , 1 , ho_id )) ho1
 , MAX(DECODE(ROWNUM , 2 , ho_id )) ho2
 , MAX(DECODE(ROWNUM , 3 , ho_id )) ho3
 , MAX(DECODE(ROWNUM , 4 , ho_id )) ho4
FROM T
GROUP BY ce_id , mo_id , ord_id 

by 손님 [2013.08.29 16:51:35]
rownum 은 순서를 보장할 수 없지 않나요? rank 를 써야할것 같은데요

by 우리집아찌 [2013.08.29 16:53:46]

질문에 해당하는 row 만 행으로  .. 이래서 그냥.. ^^*


by 우리집아찌 [2013.08.29 17:07:37]
WITH T ( ce_id , mo_id , ord_id , ho_id ) AS (
SELECT 'wo03' , 'model01' ,'g200' ,'A1' FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A2'FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A3'FROM DUAL UNION ALL
SELECT 'wo03' , 'model01' ,'g200' ,'A4'FROM DUAL UNION ALL
SELECT 'wo04' , 'model01' ,'g200' ,'A1'FROM DUAL UNION ALL
SELECT 'wo04' , 'model01' ,'g200' ,'A2'FROM DUAL UNION ALL
SELECT 'wo04' , 'model01' ,'g200' ,'A3'FROM DUAL UNION ALL
SELECT 'wo04' , 'model01' ,'g200' ,'A4'FROM DUAL 
)
-- ho1 , ho2 , ho3 , ho4 들어갈 규칙은 답변자 맘대로..
-- rank는 중복 가능성이..
SELECT ce_id 
 , MAX(mo_id) 
 , MAX(ord_id) 
 , MAX(DECODE(rn , 1 , ho_id )) ho1
 , MAX(DECODE(rn , 2 , ho_id )) ho2
 , MAX(DECODE(rn , 3 , ho_id )) ho3
 , MAX(DECODE(rn , 4 , ho_id )) ho4
FROM (SELECT T.* , ROW_NUMBER() OVER(PARTITION BY ce_id ORDER BY ho_id) rn FROM T ) 
GROUP BY ce_id

by 손님 [2013.08.29 17:37:52]
답변 감사드립니다.

해당 데이터는 고정 값이 아니라 유동적 이라서 UNION 이 사용이 가능한지 궁금합니다.

by 용근님 [2013.08.29 17:49:16]
가변컬럼은 불가능합니다.

by 마농 [2013.08.29 18:02:29]
기준이 명확해야 합니다.
1. A1, A2, A3, A4 이렇게 4개의 정해진 값을 기준으로 나누는 것인지?
2. 값은 정해지지 않고 순서대로 배치하는 것인지?
3. 배치는 4개 컬럼으로 나누는 것인지 그 이상인지?

by 소연짱 [2013.08.29 18:44:21]
안녕하세요.

우선 답변 달아주셔서 감사합니다. ㅠㅠ

row는 고정값이 아니라 유동적입니다.

A              B              C     D              E              F              G                             H
WC030    MODEL01    선반    1152283    G3220    L600A    G3220-0007 0010
WC030    MODEL01    선반    1152283    G3220    L600A    G3220-0007 0020
WC030    MODEL01    선반    1152283    G3220    L600A    G3220-0007 0030
WC030    MODEL01    선반    1152283    G3220    L600A    G3220-0007 0040
.
.
.
.

WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0010
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0020
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0030
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0040
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0050
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007 0060
 
------------------------------------------------------------------------------------------------------
결과 출력  

A              B              C     D              E              F              G                       H       H1    H2     H3
WC030 MODEL01 선반 1152283 G3220 L600A G3220-0007       0010  0020  0030  0040
.
.
.
WC099 MODEL01 선반 1152283 G3220 L600A G3220-0007       0010  0020  0030  0040  0050   0060


중복 데이터인 A~G 와  H 유동적으로 컬럼으로 가능한지 궁금합니다.

부탁드리겠습니다.

감사합니다. ㅠㅠ






by 마농 [2013.08.29 19:00:38]

컬럼을 유동적으로 늘릴 수는 없구요.
정해진 값에 의한 뷴류인지? ('0010,'0020',...)
그냥 순차적 분류인지?
에 대한 답변을 못받았네요.
갯수는 어느정도가 최대일까요?


by 소연짱 [2013.08.29 19:10:53]
답변 감사합니다 ㅠㅠ

정해진 값이라고 단정지을 수는 없지만 H 컬럼은 공정에 해당하는 부분이라

공정을 늘리면 유동적으로 증가 합니다.

최대 갯수가 있어야하면 대략 30개라 정하면 가능한지 궁금합니다.

감사합니다. ㅜㅜ

by 마농 [2013.08.29 19:28:32]
-- 정해진 값인지 아닌지 분명히 답하지 않으시네요...
-- 일단 순번을 부여해 나누겠습니다.
-- 1. 30개 컬럼으로 분류
SELECT a, b, c, d, e, f, g
     , MIN(DECODE(rn,  1, h)) h01
     , MIN(DECODE(rn,  1, h)) h02
       -- 중략 --
     , MIN(DECODE(rn, 29, h)) h29
     , MIN(DECODE(rn, 30, h)) h30
  FROM (SELECT a, b, c, d, e, f, g, h
		     , ROW_NUMBER() OVER(ORDER BY h) rn
		  FROM t
		)
 GROUP BY a, b, c, d, e, f, g
 ORDER BY a, b, c, d, e, f, g
;
-- 2. 한개 컬럼에 구분자로 합치기
SELECT a, b, c, d, e, f, g
     , LISTAGG(h, ',') WITHIN GROUP(ORDER BY h) h
  FROM t
 GROUP BY a, b, c, d, e, f, g
 ORDER BY a, b, c, d, e, f, g
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입