오라클에서 그룹별로 순번을 부여하기 위해서는 OVER 절과 분석함수(DENSE_RANK, ROW_NUMBER)를 사용하면 된다. 그룹별 단일 순번을 부여하기 위해서는 DENSE_RANK 함수를 사용하고, 연속된 순번을 부여하기 위해서는 ROW_NUMBER 함수를 사용하면 된다. 예제 1 - 그룹별 단일 순번 SELECT job , empno , ename , sal , DENSE_RANK() OVER(ORDER BY job) AS rnk FROM emp ORDER BY job DENSE_RANK() OVER(ORDER BY [그룹칼럼1, 그룹칼럼2, 그룹칼럼3 ...]) DENSE_RANK 함수와 OVER 절을 사용하여 직군별(job) 단일 순번을 부여하였다. 순번을 매길 칼럼(그룹)을 OVER 절 내부..
SQL Server에서 열(칼럼)을 행으로 바꾸기 위해서는 UNPIVOT을 사용하면 된다. 가로의 칼럼을 세로의 행으로 바꾼다고 생각하면 된다. 자주 사용하지는 않지만 개념을 이해하고 있으면 한 번쯤은 필요할 때가 있다. SELECT * FROM ( 대상테이블 or 서브쿼리 ) AS tab UNPIVOT ( 집계값칼럼명 FOR UNPIVOT대상칼럼명 IN ([UNPIVOT할칼럼명] ... ) AS unpvt UNPIVOT 사용법 WITH sal_stat(job, D_10, D_20, D_30) AS ( SELECT 'ANALYST', 0, 6000, 0 UNION ALL SELECT 'CLERK', 1300, 1900, 950 UNION ALL SELECT 'MANAGER', 2450, 2975, 285..
SQL Server에서 OR 연산자를 사용하여 여러 개의 값을 비교하는 작업을 IN 연산자를 사용하면 아주 간단하게 쿼리문을 작성할 수 있다. IN 연산자에 입력된 값 중에서 하나라도 일치하는 것이 있으면 리스트에 조회된다. IN 사용법 SELECT * FROM emp WHERE ename IN ('JONES', 'SCOTT', 'MILLER') 영문성명(ename)에 'JONES', 'SCOTT', 'MILLER'가 하나라도 일치하 값이 있으면 조회된다. IN을 사용하면 쿼리가 실행될 때 내부적으로 OR 연산자로 변경되어 실행되므로 아래와 동일한 결과가 조회된다. IN 연산자는 OR 연산자와 동일하게 실행 되므로 인덱스가 있는 칼럼에 사용할 경우 인덱스를 타지 못할 수 있으니 주의해서 사용해야 한다. ..
SQL Server에서 특정 문자열이 포함되었는지 검색을 할 때에는 LIKE 연산자를 사용하면 된다. SQL Server에서 LIKE 연산자는 타 데이터베이스와 조금 차이가 있는데 기본 옵션이 대소문자를 구분하지 않는다는 것이다. 그리고 정규식의 일부 기능인 문자 범위 패턴만 검색이 가능하다. REGEXP_LIKE와 같은 정규식 LIKE 함수는 없다. % : 0개 이상의 어떠한 문자열이 존재해도 상관없음 _ : 밑줄(_) 개수 만큰 문자가 존재해야 함 [] : 대괄호([]) 안의 지정된 문자 범위 또는 문자가 존재해야 함 [^] : 대괄호([]) 안의 지정된 문자 범위 또는 문자 외의 문자가 존재해야 함 기본 사용법 (LIKE, NOT LIKE, 대소문자 구분) SELECT * FROM Languages..
SQL Server에서 범위를 검색할 때는 BETWEEN 연산자를 사용할 수 있다. BETWEEN 연산자는 부등호(>=, =, =), 같거나 작다(), 크다(
쿼리문을 작성하다 보면 테이블에 데이터는 없지만 시작일자와 종료일자 사이의 일자(날짜)를 포함하여 조회해야 할 때가 있다. 날짜만 들어있는 테이블을 생성해서 조인하여 사용해도 되지만, 해당 기간의 데이터를 동적 뷰로 생성하여 일시적으로 사용할 수도 있다. 날짜 뷰를 생성하기 위해서는 재귀 쿼리(WITH CTE) 또는 master..spt_values 시스템 테이블을 사용하면 된다. 재귀 쿼리(WITH CTE)로 날짜 뷰 만들기 WITH DateRange(Dates) AS ( SELECT CONVERT(DATE, '2021-12-01') --시작일자 UNION ALL SELECT DATEADD(d, 1, Dates) FROM DateRange WHERE Dates < CONVERT(DATE, '2021-1..
SQL Server에서 문자열의 양쪽 공백을 제거하기 위해서는 TRIM, LTRIM, RTRIM 함수를 사용하면 된다. TRIM 함수는 SQL Server 2017 버전부터 지원하므로 이전의 버전에서는 LTRIM과 RTRIM 함수를 동시에 사용하여 문자열의 양쪽 공백을 제거해야 한다. 공백 제거 방법 (TRIM, LTRIM, RTRIM) SELECT TRIM(' SQL Server ') AS [TRIM] , LTRIM(' SQL Server ') AS [LTRIM] , RTRIM(' SQL Server ') AS [RTRIM] TRIM : 문자열의 양쪽 공백을 제거 (SQL Server 2017부터 사용 가능) LTRIM : 문자열의 왼쪽 공백을 제거 RTRIM : 문자열의 오른쪽 공백을 제거 문자열의 ..
SQL Server에서 숫자 앞에 "0"을 채워서 일정한 길이의 문자열을 만들기 위해서는 FORMAT, RIGHT, REPLICATE 함수를 사용하면 된다. SQL Server에는 오라클의 LPAD 함수는 사용할 수 없으므로 아래의 예제를 참고하면 비슷한 효과를 낼 수 있다. FORMAT 함수 사용 (방법1) SELECT FORMAT(1, '00000') AS result1 , FORMAT(12, '00000') AS result2 , FORMAT(123, '00000') AS result3 FORMAT("수치 값", "채울 값") FORMAT 함수는 SQL Server 2012 이상에서 사용할 수 있으므로 이하의 버전에서는 아래의 RIGHT, REPLICATE 함수를 사용해야 한다. SELECT FOR..
오라클에서 문자열을 날짜형 데이터로 형 변환을 하기 위해서는 TO_DATE 함수를 사용하면 된다. TO_DATE("문자열", "날짜 포맷") 아래의 예제를 보면 쉽게 이해할 수 있다. SELECT TO_DATE('2021-12-12', 'YYYY-MM-DD') , TO_DATE('2021-12-12 17:10:00', 'YYYY-MM-DD HH24:MI:SS') FROM dual 오라클에서는 날짜 포맷의 대소문자를 구분하지 않는다. 'YYYY-MM-DD HH24:MI:SS' → 'yyyy-mm-dd hh24:mi:ss'로 변경해도 정상적으로 작동한다. 날짜의 시간이 12시간 단위면 hh24:mi:ss → hh:mi:ss로 변경하면 된다. SELECT TO_DATE('20211212', 'YYYYMMDD'..
오라클에서 날짜의 시간을 오전, 오후로 구분하기 위해서는 TO_CHAR 함수를 사용하면 된다. TO_CHAR('날짜', 'AM')을 사용하면 AM, PM으로 변환되어 값이 반환 된다. 오라클의 NLS_DATE_LANGUAGE의 언어 설정에 따라서 영문(AM, PM) 또는 한글(오전, 오후)로 반환될 수 있으니 이점을 유의해야 한다. SELECT TO_CHAR(SYSDATE, 'AM') FROM dual TO_CHAR('날짜', 'AM')를 사용하여 오전(AM), 오후(PM)를 구분할 수 있다. SELECT TO_CHAR(SYSDATE, 'AM') , TO_CHAR(SYSDATE, 'PM') FROM dual TO_CHAR(SYSDATE, 'AM'), TO_CHAR(SYSDATE, 'PM') 어느 것을 사..