날짜와 이용자 별로 카운트를 하고 싶은데요,
테이블 전체중에서는 날짜가 있지만, 이용자 별의 결과가 없는 날짜는 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 에 맞게 잘 바꿔보겠습니다 ㅠㅠ
도움 부탁드립니다!!
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 ;