목록기타 코드 (5)
닌자고양이
SELECT * FROM ( SELECT 1 AS col ) a 위의 인라인뷰 a를 아래와 같이 WITH 절을 사용해 쿼리 앞에 사용하는 방식이다. WITH a AS ( SELECT 1 AS no ) SELECT * FROM a 인라인뷰에 비해 좋은 점은 WITH 식을 한번 선언후 여러 FROM 절에서 참조할 수 있다는 점과, 재귀 쿼리 기능을 제공한다는 점이다. 아래 예제는 컬럼 별칭의 정의와 ,을 사용해 여러개의 CTE를 정의하는 것을 보여준다. WITH a("컬럼별칭") AS ( SELECT 1 ), b("컬럼별칭") AS ( SELECT 2 ) SELECT * FROM a UNION SELECT * FROM b WITH 절의 재귀 쿼리는 UNION ALL 을 사용한다. -- 1부터 10까지 출력 ..
PIVOT SELECT m1, m2, m3, m4 FROM ( SELECT 'm1' col, 10 val UNION ALL SELECT 'm2' col, 20 val UNION ALL SELECT 'm3' col, 30 val UNION ALL SELECT 'm4' col, 40 val ) a PIVOT ( SUM(val) FOR col IN (m1, m2, m3, m4) ) b 결과 m1m2m3m4 10203040 UNPIVOT SELECT col, val FROM ( SELECT 10 AS m1, 20 AS m2, 30 AS m3, 40 AS m4 ) a UNPIVOT ( val FOR col in (m1, m2, m3, m4) ) b 결과 colval m110 m220 m330 m440
결과 집합을 단일 XML 태그 문자열로 반환하는 FOR XML PATH 을 사용하는 편법. 가장 좋은건 사용자 정의 Aggregate 함수를 .NET dll 로 만드는 것인데 잠시 쓸거라면... 다소 복잡한 구문이지만 별도의 확장 작성 없이 SELECT 한줄로 해결하는 유일한 방법이다. WITH T(col) AS ( SELECT 'aaa' UNION ALL SELECT 'bbb' UNION ALL SELECT 'ccc' ) SELECT STUFF((SELECT CONCAT(',', col) FROM T FOR XML PATH('')), 1, 1, '') -- MSSQL 2017 에서는 간단히 다음처럼 사용 가능 -- SELECT STRING_AGG(col, ',') FROM T CONCAT 으로 모든 값..
DAYSHOLYDAY_YNHOLYDAY_STR 2017-01-0111 2017-01-0200 2017-01-0300 2017-01-2211 2017-01-2312 2017-01-2400 2017-01-2500 2017-01-2600 2017-01-2711 2017-01-2812 2017-01-2913 2017-01-3014 1은 휴일, 0은 평일을 뜻하는데, 당일이 몇일 연속 휴일인지 알아내는 문제이다. 0 과 1 두가지 만으로 구성된 데이터를 연속성만으로 증분 그룹핑하기가 의외로 까다롭다. SELECT DAYS, HOLYDAY_YN, HOLYDAY_YN * RANK() OVER (PARTITION BY d ORDER BY DAYS) HOLYDAY_STR FROM ( SELECT *, MAX(CASE W..
숫자 테이블을 만들어 두는 것이 가장 좋지만 쿼리만으로 생성하고자 할 때 1.시스템 테이블 사용 (가장 빠름) SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS no FROM sys.all_objects a, sys.all_objects b, sys.all_objects c -- 100억 ) a WHERE no < 1000 --MSSQL SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS no FROM sys.all_objects a, sys.all_objects b, sys.all_objects c -- 100억 뷰로 만들어 쓰기 CREATE VIEW V_Numbers AS SELECT ..