마이크로소프트(Microsoft) 에서 제공하는 샘플 데이터베이스인 Adventure Works 를 가지고 CTE (Common Table Expression) 에 대해 실습해 보도록 하겠다. 결코 간단하지 않은 문제이지만 CTE를 사용하여 효과적으로 데이터를 업데이트 하도록 하겠다.
일단, Adventure Works 데이터베이스를 보면 마이크로소프트 사에서 일부러 그렇게 한 것인지는 모르겠지만 Product ID 709 의 판매금액이 모든 Sales Person 의 판매실적량에 더해져 있지 않다.
아래의 쿼리를 사용하여 SalesPerson ID 가 268인 판매원의 판매실적 677558.4653 을 기억해 두자. 이 값은 709 제품을 판매한 값이 포함되어 있지 않다. (왜 그런지는 직접 찾아보세요..)

그러면 709를 판매한 판매원들의 금액합계는 어떻게 구하면 될까. 다음의 쿼리를 참고하여 보면,
위와 같은 결과를 낸다. 다시 말해, 쿼리문을 보면 조건부에서 Product ID 가 709 인 경우를 찾았다. 709 번호의 제품을 판매한 금액의 합계가 SalesPersonID 별로 나오게 되었다.
그러면 이제 이 결과물을 사용하여 Sales.SalesPerson 의 SalesYTD 를 업데이트 하면 된다. 어떻게 하면 될까? 머리속에 당장 떠오르지는 않을 것이지만 CTE를 사용하여 쉽게 접근해 보도록 하겠다.
CTE 문을 사용하여 이전에 얻었던 결과물을 LineTotalReports 라는 이름의 CTE 로 임시 생성한 후에 Update 문에서 참조하였다. 그 아랫 부분을 살펴보면 SalesYTD 의 원래 값에 709 제품을 판매한 총 합계 금액을 더하였다. 이렇다면 이제 MS 에서 빠뜨린 709 제품은 판매금액을 판매원의 실적에 더한 셈이다.
결과를 확인해보자.
결과의 값은 LineTotal 인 102.6 이 더해진 677661.0653 을 나타내고 있다. 성공!
* CTE 에 대한 기본적인 설명은 이전 기사문을 통해 확인하실 수 있습니다.
----------------- 추가 ------------------------
CTE를 사용하지 않은 일반적 Query 는 아래와 같다
일반 Query 문 (Language : sql)
1: UPDATE Sales.SalesPerson
2: SET SalesYTD = SalesYTD +
3: (
4: SELECT isNull(sum(lineTotal), 0)
5: FROM Sales.SalesOrderHeader soh
6: JOIN Sales.SalesOrderDetail sod
7: ON soh.SalesOrderID = sod.SalesOrderID
8: WHERE sod.ProductID = 709
9: AND soh.SalesPersonID = Sales.SalesPerson.SalesPersonID
10: )
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5