카운트 쿼리 질문드립니다 0 2 452

by jjamong [SQL Query] [2021.08.31 15:32:45]


날짜와 이용자 별로 카운트를 하고 싶은데요,
테이블 전체중에서는 날짜가 있지만, 이용자 별의 결과가 없는 날짜는 0으로 카운트 하려고 합니다.
group by로 하거나 join해도 쉽사리 답이 나오지 않으서 질문 드립니다ㅠㅠ

예를 들자면

id user date
1 a 08-01
2 b 08-01
3 a 08-02
4 b 08-02
5 c 08-02
6 a 08-04
7 b 08-04

이런 데이터가 있을 때, ab는 01,02,04 날짜의 데이터가 있는 반면  c는 08-02만 있는데요

date user count
08-01 a 1
08-01 b 1
08-01 c 0
08-02 a 1
08-02 b 1
08-02 c 1
08-04 a 1
08-04 b 1
08-04 c 0

이런식으로 다른 이용자들에게 존재하는 날짜라면  count로 0 값을 넣고 싶습니다.
더불어 테이블 전체에서 데이터가 없는 날짜(08-03)에 대해선 출력하지 않으려고 합니다.

이런 경우 어떤식으로 쿼리를 짜야할지 모르겠네요.

postgresql를 이용중이긴 한데, oracle이나 mysql 로 주셔도 postgresql 에 맞게 잘 바꿔보겠습니다 ㅠㅠ

도움 부탁드립니다!!

by 마농 [2021.08.31 16:10:47]

user, date, count 등의 시스템 예약어를 컬럼 명칭으로 사용하는 것은 좋지 않습니다.
 

WITH t AS
(
SELECT 1 id, 'a' usr, '08-01' dt FROM dual
UNION ALL SELECT 2, 'b', '08-01' FROM dual
UNION ALL SELECT 3, 'a', '08-02' FROM dual
UNION ALL SELECT 4, 'b', '08-02' FROM dual
UNION ALL SELECT 5, 'c', '08-02' FROM dual
UNION ALL SELECT 6, 'a', '08-04' FROM dual
UNION ALL SELECT 7, 'b', '08-04' FROM dual
)
-- Oracle : Partition Outer Join --
SELECT a.dt
     , b.usr
     , COUNT(b.dt) cnt
  FROM (SELECT DISTINCT dt FROM t) a
  LEFT OUTER JOIN t b
  PARTITION BY (usr)
    ON a.dt = b.dt
 GROUP BY a.dt, b.usr
 ORDER BY a.dt, b.usr
;
WITH t AS
(
SELECT 1 id, 'a' usr, '08-01' dt
UNION ALL SELECT 2, 'b', '08-01'
UNION ALL SELECT 3, 'a', '08-02'
UNION ALL SELECT 4, 'b', '08-02'
UNION ALL SELECT 5, 'c', '08-02'
UNION ALL SELECT 6, 'a', '08-04'
UNION ALL SELECT 7, 'b', '08-04'
)
-- ANSI --
SELECT a.dt
     , b.usr
     , COUNT(c.dt) cnt
  FROM (SELECT DISTINCT dt  FROM t) a
 CROSS JOIN
       (SELECT DISTINCT usr FROM t) b
  LEFT OUTER JOIN t c
    ON a.dt  = c.dt
   AND b.usr = c.usr
 GROUP BY a.dt, b.usr
 ORDER BY a.dt, b.usr
;

 


by jjamong [2021.09.01 10:28:37]

감사합니다!!

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