티스토리 툴바


주로 오라클이나 MS-SQL 어쩌다 싸이베이스 처럼 DB 서버에 붙어 쿼리를 날리다
필요하게 되어 MDB 파일을 열어 값을 가져올일이 생겼는데 ..ㅋㅋ 필요할 듯 하여 정리해 본다.~


switch(조건1, 값1, 조건2, 값2,........ ,조건 n, 값n)
예)
SELECT NAME,
             SWITCH(DEPT='1000','영업부,DEPT='2000','자재부)
FROM AAA

==================================================================================================

IFF(조건,맞을때 값, 틀릴때 값)   : IF 가 아니라 IIF 다.^^
예)
SELECT NAME,
             IFF(DEPT='1000','영업부','기타부서')
FROM AAA

=================================================================================================
WHERE 절에는 != 가 안먹는다 <> 사용 한다.

저작자 표시 비영리
Posted by 나이스버리

row에 있는 값을 컬럼 처럼 쓰고자 할때가 있다.
이럴때 cross tab 쿼리를 쓰는데..
row의 수가 동적일때는 못쓰고 값을 알고 있다는 전제가 깔려 있어 유용할지 모르지만 일단 이런 방법도
있구나 알아 두는것도 나쁘지 않다고 생각한다.

예) 쿼리의 결과가 이렇게 나왔다고 치자

 지역  시설물  갯수
 서울시  병원  1
 서울시  공원  2
 부산시  병원  3
 부산시  공원  4

이것을 아래와 같이 바꾸고자 한다면
 지역(갯수)  병원  공원
 서울시  1  2
 부산시  3  4

SELECT 지역,
MAX(DECODE(시설물,'병원',갯수,0)) 병원
MAX(DECODE(시설물,'공원',갯수,0)) 공원

FROM 테이블
GROUP BY 지역  --꼭 그룹으로 묶는다.


저작자 표시 비영리
Posted by 나이스버리
 

그룹안에서 순위를 정할때도


오라클에서는 RANK Function을 사용해서 순위를 간편하게 부여할 수 있습니다.


RANK Function는 oracle 8i(8.1.6) 부터 가능합니다.

8.1.6 이전 버전에서는 사용 할 수 없습니다. ORA-923 error 가 발생 합니다.


plsql 내에서는 oracle 9i 부터 가능합니다.  8.1.6에서는 ORA-900 error가 발생 합니다.


-- scott유저로 접속을 합니다.

SQLPLUS scott/tiger



-- RANK() 함수를 사용하여 급여 순으로 순위를 부여한 예제 입니다. 

-- RK의 출력값을 보면 급여가 같으면 같은 순위로 부여가 됩니다.


SQL>SELECT empno, ename, sal,

        RANK() OVER (ORDER BY sal DESC ) as rk

        FROM emp;


    EMPNO ENAME             SAL         RK

--------- ---------- ---------- ----------

     7839 KING               5000          1

     7788 SCOTT            3000          2

     7902 FORD              3000          2

     7566 JONES            2975          4

     7698 BLAKE            2850          5

     7782 CLARK            2450          6

     7499 ALLEN            1600          7

     7844 TURNER          1500          8

     7934 MILLER           1300          9

     7521 WARD             1250         10

     7654 MARTIN            1250         10

     7876 ADAMS            1100         12

     7900 JAMES             950         13

     7369 SMITH              800         14






☞ 그룹별로 순위를 부여 하는 법


-- 위 예제는 deptno를 파티션으로 나누어서 부서별로 순위를 부여 합니다.

-- 특정한 그룹별로 순위를 부여하고 싶을때 사용 하면 편합니다.


SQL>SELECT deptno, ename, sal,

       RANK() OVER (PARTITION BY deptno ORDER BY sal DESC ) as rk

       FROM emp ;


 DEPTNO ENAME             SAL        RK

------- ---------- ---------- ---------

     10 KING              5000          1

     10 CLARK            2450         2

     10 MILLER           1300         3

     20 SCOTT            3000         1

     20 FORD             3000          1

     20 JONES            2975         3

     20 ADAMS            1100         4

     20 SMITH             800           5

     30 BLAKE            2850          1

     30 ALLEN            1600          2

     30 TURNER           1500        3

     30 WARD             1250          4

     30 MARTIN           1250         4

     30 JAMES             950          6

 



☞ DENSE_RANK() 함수


 DENSE_RANK( ) - 중복 RANK의 수와 무관하게 numbering을 합니다.


-- 1등, 2등, 2등 이렇게 2등이 중복되었는데 4등이 아니라 3등이 부여 됩니다.


SQL>SELECT empno, ename, sal, 

       DENSE_RANK() OVER (ORDER BY sal DESC ) as rk

       FROM emp;    

   

    EMPNO ENAME             SAL        RK

--------- ---------- ---------- ---------

     7839 KING               5000         1

     7788 SCOTT            3000         2

     7902 FORD              3000         2

     7566 JONES            2975         3

     7698 BLAKE             2850         4

     7782 CLARK             2450         5

     7499 ALLEN             1600         6

     7844 TURNER          1500         7

     7934 MILLER            1300         8

     7521 WARD             1250         9

     7654 MARTIN           1250         9

     7876 ADAMS            1100        10

     7900 JAMES             950        11

     7369 SMITH             800        12 



Posted by 나이스버리
 

CREATE PROCEDURE PRO_IMSI999

AS

BEGIN

  /* Procedure body */

  create table #imsi ( enter_dt char(8) )

  declare @ymd char(8)


  select @ymd = '20071231'


  while @ymd < '20080501'

  begin

    select @ymd = CONVERT(CHAR(8),DATEADD( dd, 1, @ymd ),112)

   insert into #imsi ( enter_dt ) values ( @ymd )

  end

  select * from #imsi


  drop table #imsi

  

END


==============================


 

CREATE PROCEDURE PRO_IMSI999

AS

BEGIN

  /* Procedure body */

  create table #imsi ( enter_dt datetime )

  declare @ymd datetime


  select @ymd = '2007-12-31'


  while @ymd < '2008-05-01'

  begin

    select @ymd = DATEADD( dd, 1, @ymd )

   insert into #imsi ( enter_dt ) values ( @ymd )

  end

  select * from #imsi


  drop table #imsi

  

END



Posted by 나이스버리
한글 자음 (초성) 으로 시작하는 문자열을 검색하기 위한 쿼리.ㅋ


 HANTERM 은 컬럼명..


select *

from 테이블

where case when HANTERM < 'ㄱ' then SUBSTRING(HANTERM, 1, 1)

            when ascii('ㄱ') <= ascii(HANTERM) and

                 ascii(HANTERM)<= ascii('ㅎ') then HANTERM

            when HANTERM < '나' then 'ㄱ'

            when HANTERM < '다' then 'ㄴ'

            when HANTERM < '라' then 'ㄷ'

            when HANTERM < '마' then 'ㄹ'

            when HANTERM < '바' then 'ㅁ'

            when HANTERM < '사' then 'ㅂ'

            when HANTERM < '아' then 'ㅅ'

            when HANTERM < '자' then 'ㅇ'

            when HANTERM < '차' then 'ㅈ'

            when HANTERM < '카' then 'ㅊ'

            when HANTERM < '타' then 'ㅋ'

            when HANTERM < '파' then 'ㅌ'

            when HANTERM < '하' then 'ㅍ'

            else                  'ㅎ'

       end = 'ㄴ'        <--이 부분이 검색을 하고자 하는 'ㄴ' 으로 시작하는 문자열 검색 부분.  

Posted by 나이스버리

sybase 는 rownum 등을 제공하지 않아~ 페이징 처리가 까다롭다.

전에 프로젝트에서 사용하던 방법인데 스토어 프로시져를 만들고

페이징을 위한 파라메터를 넘겨주어 값을 받아오는 형태인다.

일단 임시테이블에 모든 값을 부어넣고 조인을 걸어 원하는 페이징 열만 가져오기 때문에

그닥 좋은 방법처럼 보이지는 않을 수도 있으나 더 좋은 방법이 떠오르지 않음...^^

예)

create proc 페이징(                               -- 프로시져 생성
 @Page_No  int  = NULL,                        -- 페이지 번호 변수
 @List_Rows  int  = NULL,                      -- 뽑아올 열 갯수 변수
)
as
 declare @Last_Row decimal(10,0),
 @First_Row decimal(10,0)

 create table #임시테이블 (                -- 임시 테이블 생성
   Count_No numeric(10,0) identity not null primary key,     -- 번호 생성(자동증가)
    키값   --   셀렉트 한 결과 집합의 키 컬럼
 )

 insert #임시테이블(키값)
 select 키값
 from 테이블
 where 조건......... 

 select @Last_Row = @Page_No * @List_Rows
 select @First_Row = @Last_Row - @List_Rows + 1


  select   컬럼1, 컬럼2 .....
  from 테이블 AS A,
         임시테이블 AS B
   where 조건....
             and A.키값 = B.키값                
             and B.Count_No between @First_Row and @Last_Row

Posted by 나이스버리