Q&A

  • 오라클 쿼리 질문입니다.
델파이 프로그래밍 중에 오라클 쿼리실력이 모자라서.. 허허허
이렇게 질문올립니다.

아래와 같이 F1과 F2라는 필드를 가진 AAA이라는 테이블이 있습니다.

  테이블 : AAA    

   F1        F2     

   A         1       

   A         2       

   B         1       

   B         2       

   B         3       

   C         1       


오라클이구요!   8i 버전입니다.
어떻게 쿼리를 하면..

결과가 아래와 같이 나올수 있을까요??


 구분      1~2       3~4     

   A         2                    

   B         2            1       

   C         1                    


그런데… 오라클 8i는 MS-SQL처럼 CASE 문을 못쓰는 것 같더라구요!
어떻게 하면 될까요???

표가 삐뚤어 졌어도 이해해 주시리라 믿습니다.
3  COMMENTS
  • Profile
    정성훈 2003.03.06 01:05
    SELECT A.AAA, A.BBB, B.CCC FROM ( SELECT AAA, NVL(COUNT(BBB), '' ) BBB
                        FROM TEMP_TABLE
                      WHERE BBB < '3'
                      GROUP BY AAA ) A,
                   ( SELECT AAA, NVL(COUNT(BBB), '' ) CCC
                        FROM TEMP_TABLE
                      WHERE BBB >= '3'
                      GROUP BY AAA ) B
        WHERE A.AAA = B.AAA (+)

    그리고 case 와 같은 기능을 가진게 있습니다 decode
    decode( 'aaa', '', '0', 'bb' );

    aaa 가 '' 이면 0 으로 치환하고 아니면 bb로 해라.....
    if aaa = '' then 0 else bb.. 이러면 쉽게 알수있을겁니다.
    참고로 오라클에서도 case 먹습니다.
    ms-sql 과 문법도 같구요!!

    case when aaa = '1' then 'A'
            else 'B' end as CCC

    즐프...

  • Profile
    한휘 2003.03.06 02:36
    먼저 답변에 감사드립니다.

    참고로 누군가가 알려주신 답을 적어 보겠습니다.

    select f1,
    count(case when F2 between 1 and 2 then 1 end) as "1~2",
    count(case when F2 between 3 and 4 then 1 end) as "2~3"
    from AAA
    group by f1
    ;



  • Profile
    열심히 2003.03.07 01:19
    복잡하게 하지 않고도 아래 처럼 간단하게 만들수 있습니다..

    보기에는 오라클 보다 아래가 보기 쉽네요..

    해결하신것 같아서 그냥 다음에 누가 보실분들을 위해서 힌트만 적겠습니다.

    DECODE 와 SIGN 이란 함수로 만들수 있습니다...

    SIGN이란 함수는 인수로 받는 값이 양수이면 1을 0이면 0을 음수이면 -1을

    반환합니다..

    이걸이용해서 범위 를 지정한다면..

    SUM(DECODE(SIGN(DECODE(SIGN(3 - F2),1,F2,-1),1,1,0))

    위와 같이 만든다면 먼저 안쪽은 F2가 3 미만이라는 조건이고

    그렇게 해서 나온 f2가 양수일때만 이란 조건을 또 건다..

    IF (F2 < 3) AND (F2 >0) THEN
      BEGIN
      INC(범위 레코드);
      END

    위와 같은 식의 쿼리가 될겁니다..

    바깥쪽은 0초과??