특히 PARSE_DATE은 날짜를 나타내는, ‘%Y-%m-%d 형식이 아닌 string값을 날짜 타입으로 변경할때 유용하다. ( ex. 20240825 -> 2024-08-25 )
DATE( ) 사용해서 날짜 타입으로 변경 많이 하는데 %Y-%m-%d 형식이 아닌 string 값은 DATE( ) 함수 사용시 에러가 난다. 이 경우 PARSE_DATE( ) 를 사용해야한다. substr과 concat함수를 이용해서 조합하는 방법도 있지만 구문이 길어지기 때문에 PARSE_DATE( ) 을 사용하는 것을 권장한다.
DB를 일별로 수집한다고 했을때 테이블의 _table_suffix가 ‘%Y%m%d’ 형식으로 되어있는 경우가 많다. 불러온 _table_suffix를 그대로 날짜 필드로 넣고 싶을때 PARSE_DATE를 쓰면 된다. ( 예시: PARSE_DATE(‘%Y%m%d’,_table_suffix) AS yyyymmdd )
3. Appendix
1) 다루고자 하는 날짜 타입 (Date, Datetime ,Timestamp )에 따라 함수명을 변경할 수 있다.
위에서 소개한 함수들은 DATE 타입을 기준으로 함수명을 써놓았는데 예시처럼 다 변경이 가능하다 ㄴ ex) FORMAT_DATE -> FORMAT_DATETIME , FORMAT_TIMESTAMP ㄴ ex) DATE_ADD -> DATETIME_ADD , TIMESTAMP_ADD
참고로 DATE와 DATETIME, TIMESTAMP는 표현할 수 있는 날짜 범위에 차이가 있다.
DATE : 날짜를 년, 월 , 일 까지 저장하고 있는 날짜 타입
DATETIME : 날짜를 년 , 월 , 일 , 시 , 분 , 초 ,초 미만으로 저장하고 있는 날짜 타입
TIMESTAMP : 날짜를 마이크로초단위 ( 초 이하 소숫점 6자리 ) 로 정밀하게 저장하고 있는 날짜 타입
TIMESTAMP는 빅쿼리상에서는 타임존이 같이 출력된다. ( ex: 2024-01-01 12:30:12.000000 UTC ) 빅쿼리 자체적으로는 마이크로초로 날짜값을 저장하고있는데 ( 고정된 초기 시점 이후 경과된 마이크로초 수 ) 표기시에 변환해서 출력해주면서 타임존까지 같이 나타내주는것이다.
즉, 위의 rollup 구문은 인수인 market,country,customer 순으로 CUBE 계산을 하기 때문에 아래 이미지처럼 노란 형광펜으로 칠해진 부분을 구할수 없다.
어떻게 쿼리 구문을 짜야 모든 필드를 기준으로 소계를 구할수 있을까?
2. 문제 해결
UNNEST를 이용하여 배열을 만들고 ,그 배열을 소계를 구하고자 하는 필드에 덮어씌워 GROUP BY 해줌으로써 이를 구현할 수 있다.
말이 복잡해보일 수 있는데 , 정리하자면 아래 구문을 이용한다고 보면 된다.
/* UNNEST([필드1,'전체']) AS 필드 1
GROUP BY 필드 1
*/SELECT필드1,SUM(won)ASkrwFROMsample_table,UNNEST([필드1,'전체'])AS필드1-- 기존 필드와 UNNEST문에서 배열을 풀면서 지정한 필드명은 동일해야함.WHERE1=1GROUPBY필드1
소계 계산할 칼럼을 UNNEST로 묶어준다. ‘전체’를 값으로 넣은 배열을 만들어주고 UNNEST 해줘서 풀어버린후 집계해준다. ( 전체 대신 “ALL”로 전체치를 표시하고 싶으면 ‘전체’ 대신 “ALL” 을 넣으면 된다)
이때 주의할점은 UNNEST문에서 배열을 풀어줄때 별칭으로 지정하는 필드명과 SELECT문에서 사용할 필드명이 동일해야 된다는 것이다.
지정하는 필드명이 동일해야 GROUP BY로 집계하면서 필드가 덮어씌어지는 효과가 난다. 만약 UNNEST문의 필드명을 SELECT문의 필드명과 다르게 지정한다면 해당 이름으로 된 필드가 하나 더 생기게 된다. 이렇게 될 경우 헷갈릴 가능성이 크므로 위의 예시처럼 필드명을 동일하게 지정하는 것이 좋다.
expr1과 expr2가 값이 같으면, null을 반환하고 그렇지 않으면 expr1을 반환한다.
expr1과 expr2는 같은 상위 데이터 타입에 속해야하며, 비교 가능해야 한다.
IFNULL(expr1, expr2)
expr1이 null이면 expr2를 반환한다. 그렇지 않으면 expr1을 반환한다.
expr1과 expr2에는 모든 데이터 타입이 입력될 수 있다.
COALESCE(expr1,expr2)와 같은 표현이다.
2. 예시
예시 데이터셋은 아래와 같다.
-- 예시 데이터 셋 제작 코드 WITHex_tableAS(SELECT30AScol1,37AScol2,55AScol3UNIONALLSELECTnullAScol1,17AScol2,1AScol3UNIONALLSELECTnullAScol1,nullAScol2,1AScol3UNIONALLSELECT3AScol1,3AScol2,nullAScol3)SELECTco11,co12,col3FROMex_table;
위 예시 데이터에 null과 관련된 조건식( coalesce,nullif,ifnull)을 넣고 결과를 비교해보자 출력 결과는 테이블 맨 우측에 위치한 result 칼럼에서 확인할 수 있다.
/*
nullif 예시
*/WITHex_tableAS(SELECT30AScol1,37AScol2,55AScol3UNIONALLSELECTnullAScol1,17AScol2,1AScol3UNIONALLSELECTnullAScol1,nullAScol2,1AScol3UNIONALLSELECT3AScol1,2AScol2,nullAScol3)SELECTcol1,col2,nullif(col1,col2)asresult_nullif-- nullif는 expr 총 2개만 비교 가능FROMex_table