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 39280 게시물 읽기
No. 39280
조건에 따른 데이터 추출인데 도와주세요~~
작성자
Seok(goguma)
작성일
2012-02-09 09:33
조회수
4,755

SELECT 구문을 통하여 아래와 같은 값을 얻어왔습니다.

COL1  |  COL2  |  COL3  | PRICE
===============================
 A               1                1       100
 B               1                1       100
 A               2                1        50
 A               2                3        80
 B              4                 2        90
 C              6                1       120
 D              8                1        70
 C              7                2        60
 A              8                 2        75

이러한 데이터가 있을 경우,

COL1에 대하여 데이터 하나씩만 얻어와야 하는데 조건이 있습니다.

COL2의 우선순위에 의해서 데이터를 추출해야 합니다.(우선순위 : 2 -> 1 -> 3 )

COL1컬럼에서 A해당 데이터 중 COL2가 2인 데이터가 있으면 그 값을, 없으면 COL2가 1인값, 그 값도 없으면 3인값, 2,1,3 모두 없으면

존재하는 A 데이터의 PRICE 값의 평균을 나타내야 합니다. 그 후 다시 조건이 한번 더 있는데 COL1의 A데이터이고 COL2 2인 데이터가

두개 존재한다면 COL3의 값이 3번인 데이터, 그게 없으면 2번인 데이터 , 그게 없으면 1번인 데이터 이렇게 추출을 해야합니다.

결국 COL2는 (2 -> 1 -> 3 -> 평균) 의 순서가 되고, 그게 결정되면 COL3은 (3 -> 2 -> 1) 이러한 조건을 걸어서

COL1의 데이터를 하나씩만 나타내야 하는데 하수인 저에게는 너무 어렵내요 ㅠㅠ

[나타내고자 하는 데이터]

COL1  |  COL2  |  COL3  | PRICE
===============================
 A               2              3           80
 B              1              1          100
 C          평균      해당없음     90
 D          평균      해당없음     70

고수님들의 도움 부탁드리겠습니다.
 

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

WITH t AS
(
SELECT 'A' col1, 1 col2, 1 col3, 100 price FROM dual
UNION ALL SELECT 'B', 1, 1, 100 FROM dual
UNION ALL SELECT 'A', 2, 1,  50 FROM dual
UNION ALL SELECT 'A', 2, 3,  80 FROM dual
UNION ALL SELECT 'B', 4, 2,  90 FROM dual
UNION ALL SELECT 'C', 6, 1, 120 FROM dual
UNION ALL SELECT 'D', 8, 1,  70 FROM dual
UNION ALL SELECT 'C', 7, 2,  60 FROM dual
UNION ALL SELECT 'A', 8, 2,  75 FROM dual
)
SELECT col1, col2, col3
     , AVG(price) price
  FROM (SELECT col1
             , CASE WHEN col2 IN (1,2,3) THEN col2 END col2
             , CASE WHEN col2 IN (1,2,3) THEN col3 END col3
             , price
             , RANK() OVER(
               PARTITION BY col1
               ORDER BY DECODE(col2, 2, 0, 1, 1, 3, 3)
               , CASE WHEN col2 IN (1,2,3) THEN col3 END DESC
               ) rk
          FROM t
        )
 WHERE rk = 1
 GROUP BY col1, col2, col3
 ORDER BY col1
;

마농(manon94)님이 2012-02-09 13:36에 작성한 댓글입니다.

감사합니다~~마농님~~

덕분에 잘 해결하였습니다~~감사해요~

Seok(goguma)님이 2012-02-10 09:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39285OCI 프로그램에서 OCI_NODATA 가 나옵니다.
나종현
2012-02-10
3762
39284특정 row 추출 조회하기. [2]
오종목
2012-02-10
3897
39281CPU사용률 문의 [2]
슬라임
2012-02-09
3329
39280조건에 따른 데이터 추출인데 도와주세요~~ [2]
Seok
2012-02-09
4755
39278[질문] DB 성능 Memory 과점 현상... [1]
질문이
2012-02-08
3379
39277[질문] 사용중인 테이블에 기본키를 추가 할수 있을까요? [1]
궁금이
2012-02-08
3250
39276expdb [1]
hyouknow
2012-02-08
3191
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다