database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40723 게시물 읽기
No. 40723
중간에 끼워넣기 다시 문의 드립니다.
작성자
김태경(cranes)
작성일
2015-02-25 19:04ⓒ
2015-02-26 14:23ⓜ
조회수
8,613

안녕하세요

 

데이타는 다음과 같습니다.

 

SELECT '2014-11-17 07' hour ,'I003' c1 ,'1' c2,'3000' v1 ,'107000' v2 from dual union all

SELECT '2014-11-17 07','I003','1','25000','107000' from dual union all

SELECT '2014-11-17 07','I003','2','107000','107000' from dual union all

SELECT '2014-11-17 07','I003','7','463000','107000' from dual union all

SELECT '2014-11-17 08','I003','7','1445000','137000' from dual union all

SELECT '2014-11-17 08','I003','3','137000','137000' from dual union all

SELECT '2014-11-17 08','I003','1','8000','137000' from dual union all

SELECT '2014-11-17 08','I003','1','83000','137000' from dual union all

SELECT '2014-12-06 07','C152','1','2954000','284000' from dual union all

SELECT '2014-12-06 07','C152','1','95000','284000' from dual union all

SELECT '2014-12-06 07','C152','5','120000','284000' from dual union all

SELECT '2014-12-06 07','C152','1','2000','284000' from dual union all

SELECT '2014-12-06 07','C152','4','13000','284000' from dual union all

SELECT '2014-12-06 07','C152','1','30000','284000' from dual union all

SELECT '2014-12-06 07','C152','1','21000','284000' from dual union all

SELECT '2014-12-06 07','C152','2','151000','284000' from dual union all

SELECT '2014-12-06 07','C152','7','212000','284000' from dual

 

 

옆의 값을 가지고 각 값이 끝나는 지점에 마지막 로우의 옆값을 가지고   중간에 다음과 같이 값을 끼워넣기 문의 드립니다.

결과값이 잘못 되엇는데  답변해주신 성준님 대단하시네요  감사합니다.

제가 원하는건 우측의 값을 맨 마지막에 추가하는것인데 

 실제로는 컬럼이 엄청 많습니다. 그래서 가급적  group by 를 않쓰고 할수 있는 방법이 있을까 해서 

 질문을 드립니다.

2014-11-17 07 I003 1 3000
2014-11-17 07 I003 1 25000
2014-11-17 07 I003 2 107000
2014-11-17 07 I003 7 463000
2014-11-17 07 I003 7 107000
2014-11-17 08 I003 7 1445000
2014-11-17 08 I003 3 137000
2014-11-17 08 I003 1 8000
2014-11-17 08 I003 1 83000
2014-11-17 08 I003 1 137000
2014-12-06 07 C152 1 2954000
2014-12-06 07 C152 1 95000
2014-12-06 07 C152 5 120000
2014-12-06 07 C152 1 2000
2014-12-06 07 C152 4 13000
2014-12-06 07 C152 1 30000
2014-12-06 07 C152 1 21000
2014-12-06 07 C152 2 151000
2014-12-06 07 C152 7 212000
2014-12-06 07 C152 7 284000

 

 

       
이 글에 대한 댓글이 총 3건 있습니다.

with t(hour,c1,c2,v1,v2) as(
SELECT '2014-11-17 07','I003','1',   3000,107000 from dual union all
SELECT '2014-11-17 07','I003','1',  25000,107000 from dual union all
SELECT '2014-11-17 07','I003','2', 107000,107000 from dual union all
SELECT '2014-11-17 07','I003','7', 463000,107000 from dual union all
SELECT '2014-11-17 08','I003','7',1445000,137000 from dual union all
SELECT '2014-11-17 08','I003','3', 137000,137000 from dual union all
SELECT '2014-11-17 08','I003','1',   8000,137000 from dual union all
SELECT '2014-11-17 08','I003','1',  83000,137000 from dual union all
SELECT '2014-12-06 07','C152','1',2954000,284000 from dual union all
SELECT '2014-12-06 07','C152','1',  95000,284000 from dual union all
SELECT '2014-12-06 07','C152','5', 120000,284000 from dual union all
SELECT '2014-12-06 07','C152','1',   2000,284000 from dual union all
SELECT '2014-12-06 07','C152','4',  13000,284000 from dual union all
SELECT '2014-12-06 07','C152','1',  30000,284000 from dual union all
SELECT '2014-12-06 07','C152','1',  21000,284000 from dual union all
SELECT '2014-12-06 07','C152','2', 151000,284000 from dual union all
SELECT '2014-12-06 07','C152','7', 212000,284000 from dual
)
select max(rownum) no,hour,max(c1) c1
,decode(0,grouping_id(c1,c2,v1),max(c2),'A7') c2
,decode(0,grouping_id(c1,c2,v1),sum(v1),max(v2)) v1
from t
group by hour,grouping sets ((c1,c2,v1),())
order by no
 

뭐 이런식 이겠네요.

group by 안쓰고는

 

select rownum r, hour,c1,c2,v1 from t
union all
select null r, hour,c1,c2,v2 from( select row_number() over(partition by hour order by rownum desc) r,hour,c1, c2, v2 from t ) where r = 1
order by 2,1 nulls last
 

최성준(junkk)님이 2015-02-26 11:28에 작성한 댓글입니다.
이 댓글은 2015-02-26 18:38에 마지막으로 수정되었습니다.

유니크한 정렬기준 항목이 보이질 않네요...
정렬기준이 없어 일단 Rownum 을 기준으로 하겠습니다.
정렬기준이 따로 있다면 rownum 대신 사용하시는게 좋겠네요.


SELECT hour, c1
     , MIN(c2) KEEP(DENSE_RANK LAST ORDER BY ROWNUM) c2
     , NVL(v1, v2) v
  FROM t
 GROUP BY hour, c1, v2, ROLLUP((ROWNUM, c2, v1))
 ORDER BY hour, c1, ROWNUM
;


SELECT hour, c1, c2
     , DECODE(lv, 1, v1, 2, v2) v
  FROM (SELECT hour, c1, c2, v1, v2
             , ROW_NUMBER() OVER(
               PARTITION BY hour, c1 ORDER BY ROWNUM DESC) rn
          FROM t
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
 WHERE lv <= DECODE(rn, 1, 2, 1)
 ORDER BY hour, c1, rn DESC, lv
;

마농(manon94)님이 2015-02-26 16:35에 작성한 댓글입니다.

 두분의 내공에 감탄을 금치 못합니다.

 

어떻게 sql 을 작성하느냐 인데 너무 감사합니다.

어떻게 형언할수 없는 이 감사함 

 

진심으로 감사드립니다.

 

김태경(cranes)님이 2015-02-27 23:00에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40727정해진 수대로 레코드 분할 [1]
시로73
2015-03-02
6959
40725제조일자별 선입선출 쿼리문의 [2]
량디
2015-02-27
9295
40724[질문] 연속된 순차자료 우측으로 표현 [1]
안동석
2015-02-26
7067
40723중간에 끼워넣기 다시 문의 드립니다. [3]
김태경
2015-02-25
8613
40720오라클 ORA-28232, ORA-06512 오류문제 (cryptit) [1]
최진호
2015-02-20
9670
40719insert 성능질문 [2]
게르만족
2015-02-16
8378
40718최신 데이터를 사용하는 쿼리 질문드립니다. [3]
newbnewb
2015-02-12
7177
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다