개인 공부 공간/Metabase

[Metabase] Native query filter 적용

Hoon Kang 2022. 2. 14. 19:15

이번 포스팅에서는 Ask a question에서 Native query를 이용하여 filter를 적용하는 방식에 대해 설명해보겠습니다. 처음 Metabase를 사용할때는 Google Data Studio처럼 대시보드에 추가할 시 컬럼 자체가 날짜 형식 또는 범주형 변수인 경우 자동으로 필터 적용이 가능하다고 생각했었습니다. 하지만 추가적인 설정 없이 아래 쿼리문을 사용하여 대시보드에 추가할 경우 아래 사진과 같은 현상이 나타납니다.

SELECT People.NAME,
       Orders.TOTAL - (CASE WHEN Orders.DISCOUNT IS NOT NULL THEN DISCOUNT
                            ELSE 0 END) AS TOTAL,
       Orders.CREATED_AT,
       Products.TITLE,
       Products.CATEGORY,
       People.STATE
FROM Orders
JOIN Products ON Orders.product_id = Products.id
JOIN People ON Orders.user_id = People.id;

필터 적용 실패

쿼리문을 보면 분명히 CREATED_AT 이라는 날짜 형식 컬럼이 존재하는데도 대시보드에서 날짜 필터를 적용하려고 하면 No valid fields 가 뜹니다. 이 부분때문에 처음 Metabase를 사용할 때 조금 당황했지만 공식 문서를 봐보니 그렇게 어렵지 않게 추가가 가능하다고 느꼈습니다. 이제 아래에서는 native query에서 필터 적용을 하는 방식에 대해 알아보겠습니다.

1. Dropdown menu & date filter

우선 가장 기본적인 범주형 변수와 날짜 필터 적용 방식에 대해 알아보겠습니다. Metabase의 native query에서 이와 같은 필터를 적용하기 위해서는 WHERE 절에 필터를 적용하고 싶은 변수를 {{}} 로 감싸주면 됩니다. 여기서 한가지 주의할 점은 일반적인 SQL 문법과 다르게 WHERE 절 후 =를 사용하지 않고 단순하게 WHERE {{field}} 이렇게 해주면 됩니다. 만약 다중 필터를 사용하고 싶으면 WHERE {{field_1}} AND {{field_2}} 이렇게 해주면 됩니다. 이제 아래 구체적인 쿼리문과 예시 화면을 통해 설명해보겠습니다.

SELECT People.NAME,
       Orders.TOTAL - (CASE WHEN Orders.DISCOUNT IS NOT NULL THEN DISCOUNT
                            ELSE 0 END) AS TOTAL,
       Orders.CREATED_AT,
       Products.TITLE,
       Products.CATEGORY,
       People.STATE
FROM Orders
JOIN Products ON Orders.product_id = Products.id
JOIN People ON Orders.user_id = People.id
WHERE {{CATEGORY}} AND {{CREATED_AT}} AND {{STATE}};

 

dropdown menu & date filter

 

위의 예시 쿼리문 처럼 필터를 적용할 컬럼들을 {{}} 안에 추가해주면 사진과 같이 자동으로 우측의 필터 적용 설정 화면이 뜨게 됩니다. 설정 부분에서 Variable type은 Field Filter로 설정해주고, Field to map to에서는 필터를 적용할 컬럼을 테이블 선택 후 선택해주면 됩니다. 여기서 만약 날짜형인 경우 Month and Year, Quarter and Year, Single Date, Date Range, Relative Date, Date Filter과 같이 다양한 선택지가 존재하고, 범주형 변수인 경우 Category 한가지만 존재합니다.

아래 대시보드는 최종적으로 날짜, 지역, 카테고리 필터 적용이 완료된 대시보드이고 이 중 2019년 5월, Widget 카테고리, NY 주를 적용한 결과입니다.

 

filter 적용 대시보드

 

2. 조건 filter

이번에는 native query를 이용하여 특정 값보다 크거나 작은 조건에 대한 값들만 볼 수 있는 필터를 설정하는 방식에 대해 설명해보겠습니다. 조건을 걸기 위해서는 WHERE 절 안에 비교할 값, 조건 부등호, {{}} 안에 넣을 값이 모두 있어야 합니다. TOTAL-DISCOUNT가 필터에 입력할 값보다 큰 값들만 조회하는 필터가 적용된 예시 쿼리문은 다음과 같습니다.

SELECT PRODUCT_ID, TOTAL, DISCOUNT, TOTAL-DISCOUNT
FROM orders
WHERE TOTAL-DISCOUNT > {{TOTAL_minus_DISCOUNT}};

여기서는 {{}} 안에 들어가는 값은 필터 명칭이기 때문에 꼭 컬럼에 있는 값을 입력하지 않아도 괜찮습니다. 이번에는 최종적으로 우측 필터 적용 화면에서 설정하는 방법에 대해 설명하겠습니다.

 

조건 filter 적용

 

위 예시에서는 숫자에 대한 비교를 하기 때문에 Variable type을 Number로 지정해 준 후 Required? 부분에는 우선 0으로 입력하여 모든 값이 조회되도록 합니다. 이제 대시보드에 추가 후 필터를 적용해보겠습니다.

 

조건 filter 적용 대시보드

 

필터 안에 50을 입력하여 TOTAL - DISCOUNT 가 50 보다 큰 값들만 조회하도록 했습니다.


References