Skip to main content

바인드 변수 및 집계 함수

학습 목표

이 유닛을 완료하면 다음을 수행할 수 있습니다.

  • Apex 바인드 변수를 삽입하여 쿼리를 동적으로 만들 수 있습니다.
  • 집계 함수를 사용하여 쿼리에서 데이터를 롤업하고 요약할 수 있습니다.
  • 쿼리 결과를 그룹화할 수 있습니다.
  • WHERE 절과 HAVING 절을 각각 언제 사용해야 하는지 파악할 수 있습니다.

Trail Together로 함께 따라하기

이 단계를 진행하면서 전문가와 함께 따라하고 싶으세요? Trailhead Live의 Trail Together 시리즈에 포함된 이 비디오를 시청하세요.

(뒤로 돌려 단계를 처음부터 다시 보고 싶은 경우, 이 클립은 오전 1:10:42분 표식에서 시작된다는 것을 기억하세요.)

소개

기초적인 SOQL 쿼리를 작성하는 방법과 상위 또는 하위 개체에 필드가 포함된 쿼리를 구성하는 방법에 대해 알아봤습니다. 하지만 아시다시피 각각의 애플리케이션 개발 프로젝트는 저마다 고유한 특징을 갖습니다. 그렇기 때문에 특정 문제를 해결하기 위해 비즈니스 로직을 맞춤화하는 방법을 알고 있는 것이 중요합니다.

바인드 변수

코드를 맞춤화하는 한 가지 방법으로 바인드 변수를 사용하는 것이 있습니다. 이는 사용자 인터페이스에서 양식을 열고 입력 필드를 수정하여 특정 결과를 검색하는 것과 유사합니다. DreamHouse 앱을 예시로 살펴보겠습니다. 여러분은 주택 부동산 중개인으로 20만 달러 미만의 부동산 매물을 검토하고자 합니다. 그래서 다음과 같은 쿼리를 작성합니다.

List<Property__c> property = [SELECT Id, Name, Price__c FROM Property__c WHERE Price__c < 200000];

이 쿼리는 무척 간단하지만 정적입니다. 이 쿼리는 항상 20만 달러 미만의 주택만 반환합니다. SOQL 쿼리를 작성하여 Developer Console에서 실행할 수 없는 부동산 중개인과 잠재적 구매자는 어떨까요? 이들에게는 자신에게 맞는 가격으로 주택을 필터링할 수 있는 더 쉬운 방법이 필요합니다. 예산이 20만 달러인 구매자와 80만 달러인 구매자에게 적합한 하나의 쿼리를 작성하려면 어떻게 해야 할까요? 여기에서 바인드 변수가 필요합니다. 바인드 변수는 SOQL 쿼리에서 사용하는 Apex 변수입니다. 바인드 변수를 나중에 제공할 특정 값의 자리 표시자로 사용할 수 있습니다.

참고

이는 새로운 개념이 아닙니다. 여러분은 이미 관리자를 위한 개체 지향 프로그래밍에서 매개변수를 메서드의 자리 표시자로 사용하는 방법을 배웠습니다. 메서드를 호출하면 매개변수를 대체하는 인수를 전달하게 됩니다. 쿼리의 바인드 변수는 메서드의 매개변수와 같습니다. 쿼리가 실행되면 바인드 변수가 특정 값으로 대체됩니다.

maxHomeValue라는 바인드 변수를 고려해봅시다. Apex에서 변수를 선언한 다음 쿼리에서 다음과 같이 변수를 사용합니다.

Integer maxHomeValue = 200000;
List<Property__c> property = [SELECT Name, Price__c FROM Property__c WHERE Price__c < :maxHomeValue];

쿼리에서 바인드 변수 앞에는 콜론( : )이 자리합니다. 이 쿼리는 부동산 개체의 이름과 가격을 반환합니다. 하지만 결과는 주택 가격을 기준으로 필터링됩니다. WHERE Price__c < :maxHomeValue. 바인드 변수 maxHomeValue의 값은 쿼리 바깥에 설정됩니다. 실제 사용 사례를 살펴보겠습니다.

  1. Trailhead Playground에서 앱 시작 관리자을 클릭하고 검색 상자에 Dream을 입력한 다음 DreamHouse 앱을 선택합니다.
  2. Property Explorer(부동산 탐색기)를 클릭합니다.
    Property Explorer가 최대 가격 범위와 같은 여러 필터를 기준으로 이용 가능한 부동산을 검색합니다. Max Price(최대 가격) 슬라이더는 maxHomeValue 바인드 변수의 값을 허용합니다.
  3. Max Price(최대 가격) 슬라이더를 550K로 옮기세요.

슬라이더를 이동할 때마다 관련 값이 바인드 변수를 통해 코드에서 수정됩니다. 쿼리가 실행되고 Property Explorer 페이지에 표시된 부동산 목록에 결과를 추가합니다.

슬라이더는 Apex 코드에서 변수 값을 설정합니다. 해당 값이 쿼리에서 변수 자리 표시자를 대체합니다.

WHERE 절에서 바인드 변수를 사용하면 쿼리를 실행하기 전에 코드에서 변수 값을 설정할 수 있습니다. 바인드 변수는 쿼리를 동적으로 만들어줍니다 각 사용자에 대한 쿼리를 사용자 정의하려면 사용자 입력을 기준으로 바인드 변수 값을 설정합니다. 코드를 계속해서 수정하고 검토하면 여러 유형의 필드에서 데이터가 지속적으로 변경되는 것을 발견할 수 있습니다.

집계 함수

보고서에서 롤업 요약 필드를 사용하여 관련 레코드의 값을 계산합니다. 예를 들어 총 부동산 수, 또는 도시 내 부동산의 평균값이나 최고값을 계산하고 싶을 수 있습니다. SOQL에서는 집계 함수를 사용하여 이러한 계산 및 기타 계산을 수행합니다.

SOQL 쿼리를 위한 집계 함수

집계 함수

설명

COUNT()

필드와 연결된 행 수를 반환합니다.

SELECT COUNT(Name)FROM Broker__c

COUNT_DISTINCT()

쿼리 조건과 일치하는 고유 행 수를 반환합니다.

SELECT COUNT_DISTINCT(City__c)FROM Property__c

MIN()

필드의 최소값을 반환합니다.

SELECT MIN(Days_On_Market__c)FROM Property__c

MAX()

필드의 최대값을 반환합니다.

SELECT MAX(Beds__c)FROM Property__c

AVG()

숫자 필드의 평균값을 반환합니다.

SELECT City__c, AVG(Days_On_Market__c)FROM Property__c GROUP BY City__c

SUM()

숫자 필드의 총 값을 반환합니다.

SELECT SUM(Price__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name

도시의 부동산을 예로 들어보죠. 다음과 같은 간단한 쿼리로 시작한다고 가정해 보겠습니다.

SELECT City__c FROM Property__c

쿼리가 각 12개 부동산에 대한 도시를 반환합니다.

쿼리 결과 - 총 행 수: 12. 테이블에 하나의 열이 있으며 도시를 표시합니다.

전체 도시 목록을 원하는 것이 아니므로 쿼리를 수정하여 집계 함수를 사용합니다. 총 부동산 개수를 확인하려면 COUNT() 함수를 사용합니다.

집계 함수가 아래와 같이 쿼리의 SELECT 절에 들어갑니다.

SELECT COUNT(City__c) FROM Property__c. COUNT가 집계 함수, City__c가 필드, Property__c가 개체입니다.

함수 이름 뒤의 괄호에는 계산에 사용할 필드 이름이 포함됩니다. 이 예시에서는 City__c 필드의 값을 계산합니다.

COUNT() 쿼리 실행

  1. 쿼리 편집기에서 다음을 입력합니다.
    SELECT City__c FROM Property__c
  2. Execute(실행)를 클릭합니다.
    쿼리 결과에는 각 부동산의 도시가 포함된 12개 행이 있어야 합니다.
  3. 다음과 같이 City__c 필드가 COUNT() 함수에 삽입되도록 쿼리를 편집합니다.
    SELECT
    COUNT(City__c)
     FROM Property__c
  4. Execute(실행)를 클릭합니다.
    쿼리 결과가 City__c 필드를 기준으로 한 부동산 개수인 12로 나타나야 합니다.
    쿼리 결과 - 총 행 수: 1. 테이블에 하나의 값으로 12가 표시됩니다.

12개 모든 부동산이 속한 도시가 2개라는 것을 알게 되었다면 개수가 왜 2개가 아닌 12개인지 궁금할 것입니다. COUNT() 함수는 모든 값을 계수하기 때문입니다. 여기에는 동일한 값을 가진 여러 개의 레코드가 포함되기도 합니다.

한 도시의 모든 부동산에 한 명의 중개업자를 할당한다고 가정해 보겠습니다. 몇 명의 중개업자가 필요할까요? 바꿔 말하면, 12개의 부동산은 얼마나 많은 고유한 도시를 대표할까요? 고유한 도시만 계수하려면 다른 함수가 필요합니다. ('고유하다'는 '구별되다'라는 의미로 생각할 수 있습니다.)

COUNT_DISTINCT()는 중복되지 않는 고유한 값만 반환한다는 점을 제외하면 COUNT()와 유사합니다.

COUNT_DISTINCT 쿼리 실행

  1. 쿼리 편집기에서 다음과 같이 쿼리를 편집하여 COUNT_DISTINCT() 함수를 사용합니다.
    SELECT COUNT_DISTINCT(City__c) FROM Property__c
  2. Execute(실행)를 클릭합니다.
    이제 결과가 모든 부동산에서 고유한 City__c 값의 개수인 2로 표시됩니다.
    쿼리 결과 - 총 행 수: 1. 열: count_distinct(City__c) Value 2.

Cambridge, Boston, Brookline만이 City__c 필드에서 찾을 수 있는 고유한 값입니다. COUNT() 및 COUNT_DISTINCT() 함수는 대소문자를 구분합니다. 따라서 Cambridge는 cambridge의 중복 항목이 아닙니다. Cambridge와 cambridge는 두 개의 고유한 값으로 간주됩니다.

MIN(), MAX(), AVG(), SUM()

기다 유용한 집계 함수로는 MIN(), MAX(), AVG(), SUM() 등이 있습니다.

MIN() 및 MAX() 함수는 간단합니다. MIN()은 최소(최저) 값을, MAX()는 최대(최고) 값을 찾습니다. 그런데 이러한 함수에는 고유한 기능이 있습니다. 숫자는 물론 날짜와 시간까지 처리한다는 점입니다.

  1. 쿼리 편집기에서 다음을 입력합니다.
    SELECT MIN(Date_Listed__c) FROM Property__c
  2. Execute(실행)를 클릭합니다.

MIN() 함수는 가장 빠른 날짜를 반환합니다. MAX() 함수는 가장 느린(최근) 날짜를 반환합니다.

또한 MIN() 및 MAX() 함수는 선택 목록 값의 정렬 순서를 인식하므로 선택 목록에서 첫 번째 또는 마지막 값을 찾을 수 있습니다.

AVG() 함수는 모든 값의 평균을 계산합니다. SUM() 함수는 모든 값의 총계를 계산합니다. 두 함수 모두 계산을 수행하므로 숫자 값을 포함하는 필드에서만 사용할 수 있습니다.

집계 함수의 결과 그룹화하기

집계된 데이터를 기준으로 값을 계산한 후에는 요약 보고서에서처럼 결과를 그룹별로 보고할 수 있습니다. SOQL 쿼리의 값을 그룹화하려면 GROUP BY 절을 사용합니다. DreamHouse Realty의 한 고객이 어떤 중개업자가 부동산을 판매했는지 알고 싶어하는 경우를 예로 들어보겠습니다.

GROUP BY 절 실습해보기

다음으로 쿼리에서 GROUP BY 절을 사용합니다.

  1. 쿼리 편집기에서 다음을 입력합니다.
    SELECT MAX(Status__c), Broker__r.Name
    FROM Property__c
    GROUP BY Broker__r.Name
  2. Execute(실행)를 클릭합니다.
    결과에 여덟 개 행이 표시되어야 합니다.
    쿼리 결과 - 총 행 수: 8, 열 1 - max(Status__c), 열 2 - Name.

이 쿼리는 중개업자별로 부동산을 그룹화한다는 점을 기억하세요. 각 중개업자의 부동산의 경우 가장 최신의 Status__c 값을 나열합니다. 그것이 최종 선택 목록 값과 가장 근접한 상태 선택 목록 값입니다. 부동산을 판매한 중개업자를 원하기 때문에 결과를 더 좁혀야 합니다. 처음부터 다시 시작해 보겠습니다.

집계 함수의 결과 필터링하기

결과를 좁히기 위한 또 다른 방법으로는 HAVING 절을 사용하는 것이 있습니다. HAVING 절은 집계 함수에 의해 반환된 결과를 필터링합니다.

부동산을 판매한 중개업자를 찾는 데 사용할 수 있을 것 같네요. 이전 쿼리에서는 어떤 상태이든 부동산을 보유한 모든 중개업자의 목록을 반환했습니다. HAVING 절을 사용하여 그 결과를 좁혀보겠습니다.

  1. 쿼리 편집기에서 다음을 입력합니다.
    SELECT MAX(Status__c), Broker__r.Name
    FROM Property__c
    GROUP BY Broker__r.Name
    HAVING MAX(Status__c) = 'Closed'
  2. Query(쿼리)를 클릭합니다. 이제 한 곳의 중개업자가 나타날 것입니다.
    쿼리 결과 - 총 행 수: 1. 열 1: max(Status__c). 열 2: Name.

예, 맞습니다. 시작해 보겠습니다. HAVING 절을 사용하면 Closed(종결됨) 상태의 부동산으로 결과를 좁히게 됩니다. 잘하셨습니다!

WHERE 절은 HAVING 절과 많이 비슷하지 않나요? 다음은 WHERE 절과 HAVING 절을 각각 언제 사용할지 결정하는 방법입니다.

  • WHERE 절은 집계 함수가 없는 SOQL 쿼리에서 레코드를 필터링합니다.
  • HAVING 절은 데이터가 집계 함수에 의해 집계된 이후 결과를 필터링합니다.

이 모듈에서 학습한 바와 같이 SOQL은 Salesforce org에서 데이터에 액세스하기 위한 훌륭한 도구입니다. Apex 코딩 기술을 계속 개발하고 확장하면서 SOQL 지식을 활용할 수 있는 수많은 기회를 만나게 될 것입니다. 이 모듈에 제공된 리소스에서 Apex 및 SOQL에 대한 세부 정보, 예시, 추가 정보를 참고하는 것도 잊지 마세요. 그럼 SOQL을 이용해 쿼리를 만들어보세요.

리소스

Salesforce 도움말에서 Trailhead 피드백을 공유하세요.

Trailhead에 관한 여러분의 의견에 귀 기울이겠습니다. 이제 Salesforce 도움말 사이트에서 언제든지 새로운 피드백 양식을 작성할 수 있습니다.

자세히 알아보기 의견 공유하기