반응형
-나의 상황
: 통계 집계 화면에서 시간대별/요일별/일별/월별 테이블을 보여줘야함.
집계 테이블에 기준 값 별로 데이터가 모두 잘 들어가있으면 그대로 보여주면 되는데..데이터가 있을때만 집계테이블에 넣어주고 있어서 화면에 그대로 뿌려줄 수 없어서 아래 방법을 이용함..
- 시간대별
WITH RECURSIVE TIME_TB AS (
SELECT 0 AS TIME
UNION ALL
SELECT TIME + 1 FROM TIME_TB WHERE TIME < 23
)
SELECT
CONCAT(LPAD(TIME_TB.TIME, 2, 0), ' ~ ', LPAD(TIME_TB.TIME+1, 2, 0)) AS TIME
, TIME_TB.TIME AS TIME2
, IFNULL(B.합1, 0) AS 합1
, IFNULL(B.합2, 0) AS 합2
, IFNULL(B.합3, 0) AS 합3
, IFNULL(B.합4, 0) AS 합4
FROM TIME_TB
LEFT JOIN (
집계할 테이블
) B
ON TIME_TB.TIME = B.TIME
- 요일별
WITH RECURSIVE TIME_TB AS (
SELECT 1 AS TIME
UNION ALL
SELECT TIME + 1 FROM TIME_TB WHERE TIME < 7
)
SELECT
CASE WHEN TIME_TB.TIME = 1 THEN '일'
WHEN TIME_TB.TIME = 2 THEN '월'
WHEN TIME_TB.TIME = 3 THEN '화'
WHEN TIME_TB.TIME = 4 THEN '수'
WHEN TIME_TB.TIME = 5 THEN '목'
WHEN TIME_TB.TIME = 6 THEN '금'
WHEN TIME_TB.TIME = 7 THEN '토' END AS TIME
FROM TIME_TB
---join 은 생략---
- 일별
WITH RECURSIVE TIME_TB AS (
SELECT STR_TO_DATE('20230301', '%Y%m%d') AS TIME
UNION
SELECT DATE_ADD(TIME_TB.TIME, INTERVAL 1 DAY)
FROM TIME_TB
WHERE DATE_ADD(TIME_TB.TIME, INTERVAL 1 DAY) <= STR_TO_DATE('20230312', '%Y%m%d')
)
SELECT
DATE_FORMAT(TIME_TB.TIME, '%Y.%m.%d') AS TIME
FROM TIME_TB;
- 월별
WITH RECURSIVE TIME_TB AS (
SELECT STR_TO_DATE('20221001', '%Y%m%d') AS TIME
UNION
SELECT DATE_ADD(TIME_TB.TIME, INTERVAL 1 MONTH)
FROM TIME_TB
WHERE DATE_ADD(TIME_TB.TIME, INTERVAL 1 MONTH) <= STR_TO_DATE('20230331', '%Y%m%d')
)
SELECT
DATE_FORMAT(TIME_TB.TIME, '%Y.%m') AS TIME
FROM TIME_TB
- 나중에 내가 다시 보려고 기록용을 남김....
잘못된 것이 있거나 더 좋은 방법이 있다면 공유해주세요.
반응형
'개발 > DB' 카테고리의 다른 글
[MySQL] on duplicate key update (키 값 여부에 따른 insert / update) (2) | 2023.02.02 |
---|---|
[MyBatis] Insert 후 Key 값 받아오기 (selectKey) (1) | 2022.11.03 |
[MySQL] mysql 에서 sequence 기능 nextval 사용하기. (0) | 2022.10.26 |
[MySQL] not exists, exists 사용하여 insert/update 하기. (0) | 2022.10.26 |
intelliJ 에서 springboot + cubrid 연결 시 만난 에러 : java.lang.UnsupportedOperationException] with root cause (1) | 2022.07.26 |