0. 오늘 QCC 테스트 보고 해설도 봤는데, 잘 이해가 안가서 아마도 작성하게 될 듯 하다.


오늘 문제! 이메일 프로모션 구하기
갑자기 카톡오고 날아오고, 난리도 아니여서 많이 힘들었다 ㅜㅜ 
특히, 화면공유하는데 카톡 날아오면 얼마나 당황스러울지... 그래서 일단은 급하게 문제 푸느라고 정작 기본적인 것도 못본 거 같다.

[내가 처음에 쓴 답]

SELECT COUNT(email_promotion)
FROM person
WHERE person_type='IN' AND email_promotion IN (1,2)

[해설 쓰고 돌린 값]

SELECT COUNT(business_entity_id) AS customer_count
FROM person
WHERE person_type='IN' AND email_promotion IN (1,2)

고친 내용
customer_count 로 다시 Alias (별명)을 붙여서 출력을 Customer_count 로 다시 변환
COUNT 를 COUNT(1)로 써도 된다고 하셨다.

이게 이전 값도 같긴 하지만, 좀더 출력값 예시에 걸맞는 상태로 바뀌었다! ㅜㅜ

[내가 가져온 것]

SELECT SUM(F.order_qty) AS Total_quantity
FROM sales_order_header AS D INNER JOIN sales_order_detail F ON D.sales_order_id = F.sales_order_id
WHERE D.status IN (1,2,5) AND SUM(F.order_qty) >= 70

SELECT
from person AS A INNER JOIN sales_customer B ON A.person_id = B.business_entity_id

난 이걸 서브쿼리로 짜려고 했었는데, 이게 시간이 안되서 도저히 못풀었다! 근데 아마 시간이 충분했어도 못풀었겠지만... 일단은 왜 저기서 SUM 함수가 안됐는지 좀 생각해봤는데... 저걸 Having 에 가져오는 건 어떨까 싶어졌다.

[내가 다시 쓴 쿼리문]

SELECT M.customer_id,N.first_name,N.last_name,Total_quantity
FROM
(SELECT SUM(D.order_qty) AS Total_quantity,A.customer_id
FROM sales_order_header A INNER JOIN sales_order_detail D ON A.sales_order_id = D.sales_order_id
WHERE A.status <> 6 AND DATE_FORMAT(A.order_date,'%Y-%m-%d') LIKE '2011-10%'
GROUP BY A.customer_id
HAVING Total_quantity >= 70 ) AS M
INNER JOIN
(SELECT C.customer_id,P.first_name,P.last_name
FROM sales_customer C INNER JOIN person P ON C.person_id = P.business_entity_id
GROUP BY C.customer_id) AS N
ON M.customer_id = N.customer_id
GROUP BY M.customer_id
ORDER BY M.customer_id ASC ;

여기서 나는 어떻게 해설을 했냐면....

1. 같은 수의 표를 가져온다. 그래서 INNER JOIN를 하기 전에 서브쿼리문 부터 사용했다.
그래서 일단 order_qty 를 Total_quantity로 만들 수 있는 sales_order_header 랑 sales_order_detial을 묶었다. 대신 customer_id 는 사후에 묶을 수 있기 때문에 따로 해당 표에서 표기하기로 했다.

또한 해당 식에서 가져올 수 있는 조건은 다음과 같았다.
1) 2011년 10월 한 달에 구매한 고객
2) 배송취소 6 가 들어가지 않는 고객
3) SUM의 total_quantity 가 70이 넘는 고객

3가지를 조건을 필터링 할 수 있었다. 그러면 해당 결과는 이렇게 나왔다.
그리고 한가지 더 , SUM 과 같은 함수는 HAVING 에 넣으면 해결됐다.

2. first_name 과 last_name 을 가져올 수 있는 서브쿼리문을 작성했다.
일단 눈에 띄지는 않지만 sales_customer 랑 person 의 내용물 중 같이 묶을 수 있는건 person_id 랑 business_entity_id 를 묶을 수 있어서 INNER JOIN 시켜주었다.

위에 보다는 조건이 짧기 때문에 간결하게 작성했다.

3. 1의 서브쿼리를 M, 2의 서브쿼리를 N 이렇게 묶어서 동일하게 사용할 수 있는 customer_id 칼럼으로 INNER JOIN 시켜주었다. 그 후에 필요한 요소들은 이미 꺼냈으므로, customer_id / first_name / last_name / total_quantity 를 4가지를 출력시켰다.

생각해보니 total_quantity 는 이미 묶여있어서 굳이 또 묶을 필요는 없었다. 그래서 해당 도출값은.. 이렇게 나온다.

그래서 이렇게 나왔다. 이게 근데 내가 쓴 식이 맞는지 헷갈리기도 했다.

알고보니 JOIN 함수의 경우에는 각각 4개의 컬럼에서 동일한 내용을 가지고 오기만 하면 INNER JOIN 을 시킬 수 있었다는 내용이었다. 그리고 JOIN 은 LEFT,INNER을 쓰지 않으면 JOIN 자체가 INNER 인듯 했다. 오늘의 새로운 사실.

일단은 해당 풀이과정을 가지고 와서 이게 답이 될 수 있는 지에 대해서 여쭤보려고 한다. 있다가 튜터님들 혹시나 열리시면 좀 가서 여쭤봐야지. 풀이과정은 이렇게 했다고 하면 되니까... ㅜㅜ

여쭤보니까 2번 답의 쿼리도 맞다고 하셨다! 정답은 맞는데 INNER JOIN 으로 어떻게 다시 짤 수 있는지에 대해서 고민 해야겠다. 그리고 하나 더 알려주셨는데, 단독 컬럼이 존재하는 경우에는 따로 A.P.같은 수식을 사용하지 않아도 인식한다고 한다. 그래서 다음식도 사실 정답은 맞다. 다만, 다른 사람들을 배려하기 위해서 이를 표기하는 것에 가깝다고.

SELECT M.customer_id,N.first_name,N.last_name,Total_quantity
FROM
(SELECT SUM(D.order_qty) AS Total_quantity,A.customer_id
FROM sales_order_header A INNER JOIN sales_order_detail D ON A.sales_order_id = D.sales_order_id
WHERE A.status <> 6 AND DATE_FORMAT(A.order_date,'%Y-%m-%d') LIKE '2011-10%'
GROUP BY A.customer_id
HAVING Total_quantity >= 70 ) AS M
INNER JOIN
(SELECT C.customer_id,first_name,last_name ---> first_name / last_name 에는 점이 없다.
FROM sales_customer C INNER JOIN person P ON C.person_id = P.business_entity_id
GROUP BY C.customer_id) AS N
ON M.customer_id = N.customer_id
GROUP BY M.customer_id
ORDER BY M.customer_id ASC ;

일단은 여기까지 풀이를 해보고, TIL 의 경우 추가적으로 내용을 보충하려고 한다. 주말에 SQLD 랑 ADsP 들어야하나...? 아.... 들을건 산더미인데 ㅜㅜ 일단은 오늘 파이썬도 추가적으로 더 듣고, 4주차 5주차 뺘샤뺘샤 해야지~

myo