연습 - 조인 연산자를 사용하여 테이블 결과를 결합합니다.
이 연습에서는 연산자를 사용하는 방법을 알아봅니다 join
. join
연산자는 각 테이블에서 지정된 열의 값을 일치시켜 두 테이블의 행을 병합합니다.
운영자의 join
결과를 사용하여 판매에 대한 질문에 답변해 보겠습니다.
join
연산자 사용
소매 회사 시나리오에서 팀은 판매액이 가장 많은 3개 국가/지역을 나열하도록 요청합니다.
SalesFact 테이블 검사를 시작할 때 필요한 수치는 SalesAmount 열에서 사용할 수 있지만 테이블에는 국가/지역 데이터가 포함되지 않습니다. 다른 테이블을 살펴보면 Customers 테이블의 RegionCountryName 열에서 국가/지역 데이터를 사용할 수 있습니다. 또한 두 표에는 CustomerKey 열도 있습니다.
데이터가 두 테이블에 분산되어 있으므로 요청된 정보를 제공하는 쿼리를 작성하려면 고객 데이터와 판매 데이터가 모두 필요합니다. 쿼리를 작성하려면 연산자와 join
CustomerKey 열을 사용하여 두 표의 행을 일치시킵니다.
이제 쿼리를 작성할 준비가 되었습니다. 내부join
를 사용하여 두 테이블에서 일치하는 모든 행을 가져옵니다. 최상의 성능을 위해 고객 차원 테이블을 왼쪽 테이블로 사용하고 판매 팩트 테이블을 오른쪽 테이블로 사용합니다.
다음 절차에서는 연산자 사용 결과를 더 잘 이해할 수 있도록 쿼리를 단계별로 작성합니다 join
.
다음 쿼리를 실행하여 SalesFact 표 및 Customers 표에서 일치하는 10개의 임의의 행을 가져옵니다.
Customers | join kind=inner SalesFact on CustomerKey | take 10
결과 목록을 살펴보세요. 결과 표에는 SalesFact 표의 열과 Customers 표의 일치하는 열이 포함됩니다.
다음 쿼리를 실행하여 조인된 테이블을 요약하고 판매액이 가장 많은 3개 국가/지역을 가져옵니다.
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by RegionCountryName | top 3 by TotalAmount
결과는 다음 이미지와 같아야 합니다.
결과 목록을 살펴보세요. 쿼리를 수정하여 해당 국가/지역의 총 비용 및 수익도 표시해 보세요.
그런 다음, 팀은 최근 기록된 연도의 수익이 가장 낮은 국가/지역을 월별로 식별하도록 요청합니다. 이 데이터를 얻으려면 비슷한 쿼리를 사용합니다. 그러나 이번에는 함수를 startofmonth()
사용하여 월별 그룹화가 용이합니다. 또한 arg_min()
집계 함수를 사용하여 매월 수익이 가장 낮은 국가/지역을 찾습니다.
다음 쿼리를 실행합니다.
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by Month = startofmonth(DateKey), RegionCountryName | summarize arg_min(TotalAmount, RegionCountryName) by Month | top 12 by Month desc
결과는 다음 이미지와 같아야 합니다.
각 열을 살펴봅니다. 첫 번째 열은 지난 해의 월을 내림차순으로 표시한 다음, 해당 월의 판매 수가 가장 낮은 국가/지역의 총 판매액을 보여 주는 열을 표시합니다.
rightouter join
종류 사용
영업 팀은 제품 범주별 총 매출을 알고자 합니다. 사용 가능한 데이터를 검토하기 시작하면 제품 범주 목록을 가져오는 Products 테이블과 판매 데이터를 가져오는 SalesFact 테이블이 필요하다는 것을 알게 됩니다. 또한 각 범주의 매출을 계산하고 모든 제품 범주를 나열하려고 합니다.
요청을 분석한 후에는 오른쪽 표의 모든 판매 레코드를 반환하고 왼쪽 표의 일치하는 데이터 제품 범주로 보강되므로 rightouterjoin
을 사용하도록 선택합니다. Products 테이블을 왼쪽 차원 테이블로 사용하고 SalesFact 팩트 테이블의 데이터를 일치시키고 결과를 제품 범주별로 그룹화하여 쿼리를 작성합니다.
다음 쿼리를 실행합니다.
Products | join kind=rightouter SalesFact on ProductKey | summarize TotalSales = count() by ProductCategoryName | order by TotalSales desc
결과는 다음 이미지와 같아야 합니다.
실행 시간은 0.834초이지만 이 시간은 실행마다 다를 수 있습니다. 이 쿼리는 이 답변을 가져오는 한 가지 방법이며 성능에 최적화되지 않은 쿼리의 좋은 예입니다. 나중에 이 데이터 형식에 최적화된 연산자를 사용하여
lookup
이 시간을 해당 쿼리의 실행 시간과 비교할 수 있습니다.
rightanti join
종류 사용
마찬가지로 영업 팀은 각 제품 범주에서 판매하지 않는 제품의 수를 알고 싶어 합니다. rightantijoin
를 사용하여 SalesFacts 표의 행과 일치하지 않는 Products 표의 모든 행을 가져와서 제품 범주별로 결과를 그룹화할 수 있습니다.
다음 쿼리를 실행합니다.
SalesFact | join kind=rightanti Products on ProductKey | summarize Count = count() by ProductCategoryName | order by Count desc
결과는 다음 이미지와 같아야 합니다.
각 열을 살펴봅니다. 결과에는 제품 범주당 미분양 제품 수가 표시됩니다. rightanti
join
는 판매 팩트가 없는 제품만 선택하여 운영자가 반환한 제품에 대한 판매가 없음을join
나타냅니다.