Mission Completed

join과 distinct와 그리고 group by.....?!!! 본문

selfstudy/MySQL

join과 distinct와 그리고 group by.....?!!!

삼지안☆ 2015. 8. 5. 08:29

현재 일하고 있는 회사에 ESL 시험런칭 기간이 거의 끝나갈 무렵에 들어오게 되었다.

근데 와서 맡게될 프로젝트의 DB구조를 보니... 좀 이상한 컬럼이 몇개 있었다.

뭐 그런거야 늘상있는 일이니까- 하고 설명을 구했다. 몇몇개는 이해가 되었는데..

활용도 면에서 좀 의아한 부분은 세일가였다. 묶음 세일가격란은 있는데 1개당 가격이 따로 있지 않았던 것.

묶음 가격이 있어서 개별가격이라는 컬럼이 생겨 새로 추가를 했다고 한다...

근데 아무리 봐도 좀 이상한거지... 왜 굳이 이렇게 사용을 할까.. 하는 의문이랄까-

갯수 컬럼이 있으면 그냥 거기에 1을 넣으면 원래 있던 것처럼 사용하면 되구... 나머진 그냥 나머지에 맞게

2개에 5불이면 5불을 원래 있던 가격란에 적고 새로 만든 행을 개당가격으로 사용했다면

현재 세일 활성 기간 중 최저가를 찾는게 훨씬 쉬웠을 텐데....

그럼 이걸 일일이 코드로 하나...? 싶어서 한 10분간을 C#과 아이콘택 해주었다.

없더라. 검색을 해보아도 없다.

 

일단 프로세스를 알고나면 찾겠지- 라고 생각했지만 아니었다. 그냥 쿼리안에서 찾는데...

아무리 봐도 이 쿼리 조건은 전혀.......안 맞는다는거지..

언뜻보면 될것처럼min()도 쓰고 그룹바이 조건도 쓰고.... 그러나 정작 결과는 예상대로 제대로 된 최저가와 그의 seq를 찾지 못하고 있다.

세일 테이블에 있는 키값은 두개. PLU와 SEQ. 물건고유번호와 세일등록번호 라고 생각하면 된다.

한 아이템에 세일이 중복적으로 전산안에 들어갈 수 있기 때문에 저렇게 구분을 짓는다.

세일이 시작되기 전에 미리 넣어놓는 경우가 있다고-

 

아무튼 그래서 처음엔 코드쪽에서 일일이 비교해서 빼낼까...했지만

생각해보니 소프트웨어가 어떤이유로든 재가동이 되었는데 꺼져있는동안 POS에서 신규 세일이 등록이 되어서 최저가가 바껴있다면

그걸 알아 챌 방도도 없는 것을 발견.

그럼 그것까지도 프로그램에서 돌리자니...이건 영- 아니다 싶었다.

이유는 단 하나. 곧 시험런칭이 끝나가고 코딩을 뜯어고치려면 엮여있는게 한두개가 아니어서 반쯤은 들어내야 할 지도 모르고...

그렇게 되면 버그가... 결국 쿼리쪽을 손 보기로 했다.

 

SELECT MIN(LS_SPLIT_PRICE) AS minsplit, PLU AS itemn
FROM ls_schedule
GROUP BY itemn

 

어디라고 콕 집어 말하긴 힘들었지만 그냥 이상했다.

참고로 IS_ACTIVE는 이 시기에 유효기간을 뜻하는 것이었다-

 

아무튼 영 이상한데 시나리오대로 동작하지 않으니 고쳐야 마땅한것이다- 싶어서 고쳤다.

 

------------------------------------------------------

일단 개당 가격을 비교해야하는데 해당 컬럼이 없으니까 그걸 보여주는 뷰를 만들었다.

아래는 만든 뷰에서 대충 필요한 컬럼만 추린 내용. (세일 활성 기간이 웨어절이다)

 

 

노란색으로 표시된 50번 상품의 세일중 170번세일이 가장 최저가 인것을 알 수 있다.

 

그래서 일단 프로그램이 떠 있는 상태에서 변화가 올경우에는 보통 1개씩 순차적으로 받아서 처리를 하기때문에 그것을 만들고

그것을 응용해서 전체 돌리는 쿼리를 짜보았다....

잘 돌아가더라. 근데 문제는 테스트 방법에 있었다... 세일 등록시 가격을 점점 높였기 때문에 별 문제가 없어 보였던 것.

하지만 가격을 점점 내려서 등록하면 seq가 낮은 세일이 조회되어버렸다...

 

 

 

 

근데 이미 저대로 배치 올렸는데.... 이런..!!!!!

다행히 시험 마켓에 중복된 세일이 그리 많이 않은 상태여서 부랴부랴 혹시나- 하고 distinct를 넣어보았다.

 

허허허허..... 왜 안되니......ㅠㅠ

결과는 계속 제자리.... 혹시나 하고 조인도 inner join에서 right join으로 바꿔 보았는데 유레카!!!

 

 

근데 왜인지 모르겠다....;ㅁ;

그냥 본능이 시키는대로 바꾸었더니 되니까 좋은데....찝찝하다.

아오.... 설명이 필요해....

 

실험 정신으로 마지막 쿼리에서 distinct 만 제거해 보았다....

 

 

 

결과는 저렇다.... 왜일까...왜...대체 왜?