조건에 맞는 그룹별 데이타의 합, 카운터.. group by?

조건에 맞는 그룹별 데이타의 합, 카운터.. group by?

QA

조건에 맞는 그룹별 데이타의 합, 카운터.. group by?

본문

안녕하세요. 오늘도 질문을 드리러 왔네요.

하루빨리 누군가의 질문에 답을 드릴 수 있게 되기를 바래봅니다.

 

오늘 드릴 질문은

 

유료회원들이 낸 회비의 연도별 총합을 구하고자 할 때 group by에 대한 사용법입니다. 유료회원의 경우 일시불, 분기납, 월납이 있기에 동일인물이 1년에 최대 12회까지도 내는 경우가 있습니다.

 

구현하고 싶은 내용은..

 

연도별, 회원별로 1년에 회비를 납부한 '횟수'와 납부한 회비의 '합계'를 전체 회원에 대한 리스트페이지를 만들고자 하는 것입니다.

 

이것에 대한 힌트를 이곳의 엑스앰엘님께서 주셨는데요. 

group by라는 sql문을요... 구글을 통해 알아보니 개념은 알것같은데 실제 적용에 있어서 힘든 부분이 있습니다.

 

기본적인 변수 정의는 아래와 같습니다.

$bo_table = 'AAA' 

$wr_1 = 회원 아이디

$wr_2 = 이름

$wr_3 = 회비를 납부한 년도

$wr_4 = 해당년도에 납부한 회비 금액

$wr_6 = 해당년도 납부하여야 할 회비

 

그룹화 할 컬럼 : wr_3(연도), wr_2(이름)

계산해야 할 컬럼 : wr_4(납부한 회비)의 count, wr_4(연도별 납부한 회비의 합계금액)

 

아래처럼 sql문을 작성하긴 했는데.. 당연히 원하는 결과값이 나오질 않네요..

그룹으로 묶을 컬럼이 두개인데 어떻게 하는지 몰라 일단 wr_2만 그룹화 했습니다.

 


<?
$mem = sql_query("SELECT wr_2, wr_3, wr_4, wr_5, wr_6, COUNT(wr_2), SUM(wr_4) as m_sum FROM g5_write_AAA where wr_is_comment=0 GROUP BY wr_1 order by wr_3 DESC, wr_2 DESC");
while($row = sql_fetch_array($mem)) {
?>
    <tr>
        <td class="mem"><?=$row['wr_3'] //년도?></td>
        <td class="mem"><?=$row['wr_2']//이름?></td>
        <td class="mem"><?=$row['wr_6']//연회비?></td>
        <td class="mem"><?=$row['m_sum']//총납부횟수?></td>
        <td class="mem"><?=  ?????????     //연간 총납부금액?></td>
    </tr>
<? } ?>

 

sql문에 있는 COUNT(wr_2), SUM(wr_4) 이 두가지를 본문에 어떻게 표현해주어야 하는거죠? 

하나만 있다면 <?=$row['m_sum']//총납부횟수?> 이렇게 하는것 같은데..

 

홍길동이라는 회원이 낸 연도별 회비의 합계금액인 SUM(wr_4) 값은 본문에 어떻게 표현해야 하는건지요?

그리고, 두개의 컬럼을 그룹화 하는 방법과 두개의 집계값(wr_4의 연도별 count, wr_4의 연도별 sum의 sql문은 어떻게 되는지요?

 

몇시간째 헤매다 결국에 이곳에 질문을 드리네요...ㅜ.ㅜ

해결방법을 알려주시면 감사하겠습니다.

 

**********************************************************************************

구글링을 통해 해결했습니다. ^^

이 sql문이 정답인지는 모르겠습니다만, 제가 원하는 결과를 뽑아내는데 성공했습니다..

수정된 코드는 아래와 같습니다.

 

혹시 저같이 초보로 고생하시는 분이 계실까해서 수정된 소스 남겨둡니다.

 


<?
$mem = sql_query("SELECT wr_2, wr_3, wr_4, wr_5, wr_6, COUNT(wr_4), SUM(wr_4) FROM g5_write_AAA where wr_is_comment=0 GROUP BY wr_1, wr_3 order by wr_3 DESC, wr_2 DESC");
while($row = sql_fetch_array($mem)) {
?>
    <tr>
        <td class="mem"><?=$row['wr_3'] //년도?></td>
        <td class="mem"><?=$row['wr_2']//이름?></td>
        <td class="mem"><?=$row['wr_6']//연회비?></td>
        <td class="mem"><?=$row['COUNT(wr_4)']//연도별 납부횟수?></td>
        <td class="mem"><?=$row['SUM(wr_4)']//연도별 총납부금액?></td>
    </tr>
<? } ?>

 

이 질문에 댓글 쓰기 :

답변 2


SELECT wr_1,wr_3,
 COUNT(wr_4) pay_cnt, SUM(wr_4) pay_sum,
 wr_6,wr_2, wr_4 ## 이런 컬럼은 예상하는 값을 보장하지는 않습니다.
 FROM g5_write_AAA
 where wr_is_comment=0
 GROUP BY wr_1, wr_3
 order by wr_1 DESC, wr_3 DESC 
WITH ROLLUP ##있을 때 없을 때 결과를 보시면 대충 감이 옵니다.
청구서 납부는 전형적인 M:N 관계(모델)입니다.

청구서 테이블

입금 테이블

납부 테이블

이렇게 구성합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 5
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT