[MYSQL] 일자별 지점별 데이터 조회하기 ( group by ) 0 1 941

by 쿼리냠냠 [MySQL] [2020.01.30 16:37:51]


구루비회원님들 안녕하세요. 

쿼리를 짜는 도중에 막히는 부분이 있어 문의드립니다. 

 

다음과  같은 테이블이 있습니다. 
[1] 테이블명 :  priceTable 

id place date name amount price
1 서울점 2019-01-15 사과 1 2000
2 여수점 2020-01-01 고구마 2 1000
3 서울점 2020-01-01 감자 1 2000
4 서울점 2020-01-01 사과 1 3000
5 서울점 2020-01-01 바나나 2 4000
6 천안점 2020-01-01 수박 1 300
7 서울점 2020-01-03 고구마 1 1000
8 서울점 2020-01-03 고구마 1 1000
9 여수점 2020-01-15 수박 1 300


저는 '일자별' +'지점별'로 데이터를 추출하고싶어 다음과 같은 쿼리를 사용하였습니다.

SELECT 
 date, place as '판매지점' ,
 SUM(price*amount) as '총판매금액',
 SUM(amount) as '총판매건수'
 FROM tmp1.priceTable pt
 where LEFT(date,7) = '2020-01'
 group by pt.date,place; 

나온 결과값
=> 

date 판매지점 총판매금액 총판매건수
2020-01-01 서울점 13000 4
2020-01-01 여수점 2000 2
2020-01-01 천안점 300 1
2020-01-03 서울점 2000 2
2020-01-15 서울점 2000 1
2020-01-15 여수점 300 1


제가 원하는 결과값은 다음과같습니다.

 

date 서울점 총판매건수 서울점 총판매금액 천안점 총판매건수 천안점 총판매금액 여수점 총판매건수 여수점 총판매금액
2020-01-01 4 13000 1 300 2 2000
2020-01-03 2 2000 0 0 0 0
2020-01-15 1 2000 0 0 300 0


Q.1) 지점별 일별매출정보를 컬럼으로 놓고싶은데 가능할까요?
지점들이 100개 가량 된다면 CASE WHEN '서울점' , WHEN '천안점' ....100개의 when절을 일일이 적는 것도 아닌거같아서요ㅠ 

Q.2) 만약에 해당 일자에 매출이 없는 지점은 0으로 표시가 가능한가요? 


감사합니다. 좋은 하루보내세요!
 

by 마농 [2020.01.30 17:28:56]

1. 컬럼명을 date 와 같은 예약어를 사용하는 것은 좋지 않습니다.
2. 알리아스는 홑따옴표가 아닌 쌍따옴표 이용해 주세요.(표준, 타 DB 호환성)
3. 컬럼을 가공하여 비교하는 것은 좋지 않습니다.
 - 컬럼은 그대로 두고 조건을 가공하여 비교하세요.
 - 변경전 : WHERE LEFT(date, 7) = '2020-01'
 - 변경후 : date LIKE '2020-01%'
4. 가변 컬럼 적용은
 - 정적 SQL 로는 불가능합니다. 일일히 다 적어줘야 합니다.
 - 가변 컬럼을 원한다면 동적 SQL 이용해야 합니다.
 - 지점이 100 개 이상이라면?
 - 지점을 펼치는 것보다는 일자를 펼치는 것을 추천합니다. (31개 고정)

SELECT date
     , IFNULL(SUM(CASE place WHEN '서울점' THEN amount         END), 0) 서울점_총판매건수
     , IFNULL(SUM(CASE place WHEN '서울점' THEN amount * price END), 0) 서울점_총판매금액
     , IFNULL(SUM(CASE place WHEN '천안점' THEN amount         END), 0) 천안점_총판매건수
     , IFNULL(SUM(CASE place WHEN '천안점' THEN amount * price END), 0) 천안점_총판매금액
     , IFNULL(SUM(CASE place WHEN '여수점' THEN amount         END), 0) 여수점_총판매건수
     , IFNULL(SUM(CASE place WHEN '여수점' THEN amount * price END), 0) 여수점_총판매금액
     , SUM(amount * price) 총판매금액
     , SUM(amount) 총판매건수
  FROM tmp1.priceTable
 WHERE date LIKE '2020-01%'
 GROUP BY date
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입