ercnam
6k
2018-02-21 00:05:00 작성 2018-02-21 00:06:06 수정됨
4
553

이렇게 나오게 하려면 어떻게 쿼리를 해야할까요?? 가능할까요?



먼저 Select 문을 통해 왼쪽과 같은 결과를 뽑아냈습니다.

예를 들자면  A지점의 111상품이 몇일에 얼마만큼 신청이 들어왔냐, 를 집계하는겁니다.

(기간은 한달. 입니다)

하지만 제가 원하는건 오른쪽처럼 뽑아서 1 ROW당 1VO 오브젝트로 만들어서

jqgrid 로 그려줄려는 건데요.


지점명이 중복되게 나오는건 jqgrid에 colspan? rowspan??

아무튼 중복칸을 병합하는 기능이 있어서 그걸로 합치면 되는데

오른쪽 모양대로 데이터를 출력할려면 어떻게 쿼리를 줘야할지 모르겠습니다.

1달은 길어봐야 31일까지니까.... Where 구문에 day 를 01 부터 31까지 for문 돌리면서 List로 뽑아낼까 라는 생각도 해봤는데...흠.... 말이 되는 소린가요...쓰면서도 모르겠네요;;

아무튼 왼쪽 그림처럼 나오는 쿼리 결과물을 오른쪽 모양으로 출력이 가능한지 여쭙고 싶습니다..

0
  • 답변 4

  • nathak
    608
    2018-02-21 09:27:27

    db 가 mysql이라고 보고 쿼리 만들었습니다.



    SELECT 
    	MAX(IF(DAY=01, COUNT, NULL)) DAY01,
    	MAX(IF(DAY=02, COUNT, NULL)) DAY02,
    	MAX(IF(DAY=03, COUNT, NULL)) DAY03,
    	MAX(IF(DAY=04, COUNT, NULL)) DAY04
    FROM 
    	[TABLE]

    참고 하셔서 만들어보세요

  • 스타
    3k
    2018-02-21 09:28:31
    이런 결과릉 Pivot이라고 해요. 오라클에는 쉬운 방식이 있는데 원리는 같아요. 

    1. 아래 같은 테이블에 100 정도까지의 값을 만드세요. 다른 용도로 쓸일이 없다면 31까지만 만들면 됩니다.
    2. 조인 조건 없는 조인을 만들어 n x 31배로 row를 튀깁니다. 31일 분량이니까 최대 31 x 31 row로 늘어나겠죠?
    3. case 문을 써서 tmp 테이블의 i컬럼과 같은 day 컬럼에만 day의 수치를 표시하고 나머진 null로 표현 합니다.
    4. 지점과 상품명으로 group by를 써서 day의 max 값을 찾으면 됩니다.
    CREATE TABLE tmp (
      i int not null,
      primary key(i)
    );
  • ercnam
    6k
    2018-02-21 16:43:57

    PIVOT을 이용해 집계 성공하였습니다. 대단히 감사합니다!

    다만 한달간의 총합도 구하고 싶은데 이건 좀 더 연구해봐야 할거 같네요..

    뽑혀져 나온 VO에서 날짜에 해당하는 변수를 FOR문 31로 돌려서 다 더하던가 해야하나..

  • 스타
    3k
    2018-02-21 17:09:13

    32번째 항목을 sum으로 처리하면 될거에요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.