with data
as ( select 1 a, 6 b, 3 c, 2 d, 5 e from dual union all
select 2 a, 4 b, 5 c, 8 d, 9 e from dual union all
select 3 a, 5 b, 7 c, 10 d, 13 e from dual
)
select *
from data
아래와 같은 샘플 데이터가 있을떄, 1번 row에 대해서만
a 컬럼 밑에는 a-0
b 컬럼 밑에는 b-a
c 컬럼 밑에는 c-b
d 컬럼 밑에는 d-c
e 컬럼 밑에는 e-d
구하고 싶은데, 쿼리 부탁드립니다
[샘플 데이터]
a b c d e <-- 컬럼
1 6 3 2 5 <-- row1
2 4 5 8 9 <-- row2
3 5 7 10 13 <-- row3
[결과]
a b c d e <-- 컬럼
1 6 3 2 5 <-- row1
1 5 -3 -1 3 <-- 결과 컬럼
2 4 5 8 9 <-- row2
3 5 7 10 13 <-- row3
결과표를 행열을 정확하게 표현해 주세요.
원본 3줄 + 결과 3줄 = 전체 6줄 나오는건가요?
a-0, b-a 식의 표현 말고, 실제 값으로 표현해 주세요?
설명과 다르게 결과를 적었었네요..
수정했습니다
row가 3개 있으면
첫번째 row로 계산해서
총 4개의 row가 있어야 됩니다( 추가된 row는 1row의 컬럼들로 계산 )
첫번째 라는 걸 판별하려면 정렬기준 같은게 있어야 합니다.
a 로 정렬한다던가? 별도의 정렬기준 컬럼이 존재한다던가?
샘플 데이터에 표기하지 않았지만
내부적으로 order_seq 컬럼을 가지고 있습니다
a b c d e order_seq <-- 컬럼
1 6 3 2 5 1 <-- row1
2 4 5 8 9 2 <-- row2
3 5 7 10 13 3 <-- row3
WITH data AS
(
SELECT 1 order_seq, 1 a, 6 b, 3 c, 2 d, 5 e FROM dual
UNION ALL SELECT 2, 2, 4, 5, 8, 9 FROM dual
UNION ALL SELECT 3, 3, 5, 7, 10, 13 FROM dual
)
SELECT rn
, lv
, a
, DECODE(lv, 1, b, b - a) b
, DECODE(lv, 1, c, c - b) c
, DECODE(lv, 1, d, d - c) d
, DECODE(lv, 1, e, e - d) e
FROM (SELECT ROW_NUMBER() OVER(ORDER BY order_seq) rn
, a, b, c, d, e
FROM data
)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
WHERE lv <= DECODE(rn, 1, 2, 1)
ORDER BY rn, lv
;
감사합니다~!!