PROGRAMMING WORKSHOP

Access와 Excel의 연동_9|
SQL - Select,Where, Group By

이전 페이지에서 SELECT문과 WHERE절에 대하여 몇가지 쌤플을 만들었다
이것은 엑셀의 휠터기능과 같다고 보면 된다
그런데 어떤애완동물별로 휠터를 했는데 , 이 휠터된 내용의 진료비를 합친값이 얼마고(SUM)
몇번진료를 하였고(COUNT)
평균일회진료비는 얼마였는지(AVERAGE)등을 알고 싶을수 있을 것이다
이것이 부분합이고 Grouping을 한 것에 대한 계산값이 되는 것이다
아하..그러니 Grouping한다고 하는 것은 항상 어떤 계산을 할지 함수가 필수적이로구나..
라는 것을 아시면 된다

문제는 SQL문을 Grouping하는 것을 어떻게 작성하느냐는 것..
역시 Access의 쿼리디자인창을 활용하면 된다
애완동물X 가 총진료한 진료비는 얼마일까??라는 것을 Access의 쿼리디자인창에서
해본다면...



그림과 같이 모든 테이블을 디자인창에 넣고
원하는 값은 Price휠드의 합계이고
조건을 줄 휠드는 애완동물의 기본키값 PetID휠드에 어떤 ID값을 줄것인지를 입력해주면 된다
이때 원하는 값은 값이 나타나게 체크를 해주고, 그냥 조건만 주는 휠드는
결과로 나올필요가 없으니 체크박스를 지워준다

이제 그룹핑을 하려면 다시 메뉴한번(엑셀에서 합계를 내던 아이콘 시그마표시)을 더 크릭한다



그러면 디자인창에 [요약]이라는 행이 하나 추가된다
Grouping을 하기 위한 휠드는 [묶는 방법]이라고 표기된 항목을 선택하고
요약을 할 휠드, 여기에서는 Price휠드에서 사용할 함수를 선택한다
여기에서는 [합계]를 선택한다
그리고 PetID 열의 조건행에 1이라고 넣어주고(즉 PetID가 1인 경우의) 총금액이 계산되게 하자는 것
그리고 실행버튼(느낌표 아이콘)을 크릭하면 쿼리의 결과가 33000이라고 계산된 값을
만들어주는 것..
이제 이것의 SQL문을 얻어서 VBA의 코딩에 사용하면 되는 것



SELECT Sum(진료타입테이블.Price) AS Price의합계
FROM ((고객테이블 INNER JOIN 애완동물테이블 ON 고객테이블.CustomerID = 애완동물테이블.CustomerID) 
INNER JOIN 진료진행테이블 ON 애완동물테이블.PetID = 진료진행테이블.PetID) 
INNER JOIN 진료타입테이블 ON 진료진행테이블.TreatID = 진료타입테이블.TreatID
GROUP BY 애완동물테이블.PetID
HAVING (((애완동물테이블.PetID)=1));
 

새롭게 나타난 SQL의 키워드는 GROUP BY 그리고 HAVING 이라는 두개의 절이다
GROUP BY는 디자인창에서 [묶는 방법]으로 지정한 휠드가 기록되고
HAVING은 Grouping을 하기 위한 필수 조건절이다
(그룹핑할때 WHERE 조건절은 GROUPING 하기전의 조건절이다..이것은 나중에 또 예를 다시들도록 하자)
그리고 SELECT 절에서 SUM(진료타입테이블.Price) AS price의합계 라는 하나의 계산된 휠드만
SELECT했다,
왜냐면 디자인창에서 PetID휠드는 결과물에 포함하지 않고 조건만 입력한다고
체크박스를 지웠기때문에 나타나지 않는다
그래서 결과는 하나의 휠드에 하나의 행만 나타나게 되는 것

SELECT Sum(진료타입테이블.Price) AS Price의합계 FROM .....
AS 이후에 계산을 한 결과의 열머리명은 디자인창에서 지정하지 않으면
자동으로 [AS Price의합계] 라고 작성된다
계산 열머리명을 원하는 것으로 만들려면 AS [원하는 열머리명]을 작성하면 된다

아래와 같이 버튼을 실행하면 해당조건을 관련 콘트롤값을 읽어서
목록상자에는 휠터된 내용을 (SELECT)
라벨콘트롤에는 해당휠터된 내용의 그룹핑의 합계(SUM)함수를 사용하여 해당조건의 합계를 만들어본다



***[LOG-IN]***

위의 합계에 더불어, 평균도 계산하고 , 갯수도 계산하고, 더 나아가서 전체 매출에
대한 백분률도 계산해보고 싶을 것이다
이것은 위의 Access쿼리디자인창에서 얻어온 SQL문을 그대로 조금 수정하면 된다
전체 진료총액에 대한 비율을 내려면
전체 진료총액을 DB에서 얻어내야 할 것이다
그런데 진료비는 진료진행테이블과 진료타입테이블이 연결되어야 값을 얻을수 있다
이것도 잘 감이 안오면 억세스를 열고, 쿼리디자인을 하나 해보면 된다
아래의 그림과 같이



조건은 아무것도 없이 전체를 합치는 것이니까..
즉 엄밀히 따지면 진료진행테이블에서 진행된 것만
그래서 진료진행테이블과 진료타입데이블에서 금액을 참조하여 가져오는 것

두번째 화일에서 내용을 살펴보시기를..

***[LOG-IN]***