반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- java
- 입출력
- 오버로딩
- 쿠키
- 붕대 감기
- 중첩 break
- 자바의 정석
- 객체지향
- 멀티프로세싱
- 붕대 감기 자바
- over()
- spring security
- CPU
- 티스토리챌린지
- 다형성
- 프로그래머스 붕대 감기
- hackerrank
- 프로그래머스
- 자바의정석
- 오블완
- break 사용법
- 리눅스
- 멀티태스킹
- SQL Mapper
- 오버라이딩
- continue 사용법
- spring security 설정
- contiune
- 혼공얄코
- 캡슐화
Archives
- Today
- Total
쉽게 쉽게
[MYSQL] select문에 count 여러개 본문
반응형
▤ 목차
1. 이슈
SELECT문 조회한 결과에 대한 COUNT()들을 같이 출력할 필요성이 생겼다.
다만 COUNT 조건이 각기 달라서 이를 해결하기 위해 방안을 찾아봤다.
1. SELECT문 조회 쿼리
ACT_TIME 테이블에는 활동시간과 종료시간 정보가, REPORT_CONTENT 테이블에는 보고서 타입이 존재한다.
이를 JOIN하여 유저별로 정보를 가져왔을 때, 아래와 같은 조회결과가 나오게 된다.
이때, A타입의 보고서 수 , B타입의 보고서 수의 통계를 결과와 함께 추출해야 한다.
SELECT
RC.CONTENT_TYPE, /* 보고서 타입 (A, B 타입존재) */
AT.ACT_DATE, /* 활동일 */
AT.START_TIME, /* 활동시간 */
AT.END_TIME /* 종료시간 */
FROM
ACT_TIME AT
INNER JOIN REPORT_CONTENT RC ON
RC.content_idx = AT.content_idx
WHERE
AT.user_code = ???
AND AT.report_idx = ???
2. SELECT문에서 여러 개의 COUNT() 값만 조회할 경우
1. COUNT() 조건 설정
COUNT() 통계만 추출하면 될 경우에는 원하는 조건을 설정하여 COUNT() 값을 추출하면 된다.
- CASE WHEN을 이용
- COUNT()와 GROUP BY를 이용
단 COUNT()를 추가하면 통계값은 구할 수 있을지 몰라도 SELECT 조회값을 상실하게 된다.
// 1. CASE WHEN 사용
SELECT
COUNT(CASE WHEN RC.act_type = 'A' THEN 1 END) AS Acnt,
COUNT(CASE WHEN RC.act_type = 'B' THEN 1 END) AS Bcnt
FROM
ACT_TIME AT
INNER JOIN REPORT_CONTENT RC ON
RC.content_idx = AT.content_idx
WHERE
AT.user_code = ???
AND AT.report_idx = ???
// 2. COUNT()와 GROUP BY 사용
SELECT
RC.CONTENT_TYPE,
AT.ACT_DATE,
AT.START_TIME,
AT.END_TIME,
COUNT(RC.CONTENT_TYPE) AS CNT /* COUNT 추가 */
FROM
ACT_TIME AT
INNER JOIN REPORT_CONTENT RC ON
RC.content_idx = AT.content_idx
WHERE
AT.user_code = ???
AND AT.report_idx = ???
GROUP BY RC.CONTENT_TYPE /* GROUP BY 추가 */
3. SELCT문에서 조회결과와 여러 개의 COUNT() 값을 함께 조회할 경우
1. OVER() 사용
OVER() 함수는 보통 다른 윈도우 함수들과 함께 쓰이지만 OVER() 만을 사용할 수도 있다.
OVER() 함수는 모든 행에 대해 계산된 집계 값을 반환하는 것을 의미한다.
이것을 활용하여 SELCT 조회결과에 COUNT() 값을 붙여 조회했다.
SELECT
RC.CONTENT_TYPE, /* 보고서 타입 (A, B 타입존재) */
AT.ACT_DATE, /* 활동일 */
AT.START_TIME, /* 활동시간 */
AT.END_TIME, /* 종료시간 */
COUNT(CASE WHEN RC.CONTENT_TYPE = 'A' THEN 1 END) OVER() AS Acnt,
COUNT(CASE WHEN RC.CONTENT_TYPE = 'B' THEN 1 END) OVER() AS Bcnt
FROM
ACT_TIME AT
INNER JOIN REPORT_CONTENT RC ON
RC.content_idx = AT.content_idx
WHERE
AT.user_code = ???
AND AT.report_idx = ???
https://java119.tistory.com/36
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
반응형
'DB > MYSQL와 MariaDB' 카테고리의 다른 글
[MariaDB]MariaDB에서 오라클 DB 연동 (0) | 2024.08.12 |
---|---|
[MariaDB] 이클립스 MariaDB와 연동하기 (0) | 2024.08.06 |
[MYSQL] 윈도우 함수 정리 (0) | 2024.07.08 |
MariaDB 대소구분 해결 (0) | 2024.03.21 |
[MYSQL] 쿼리 속도개선 (1) | 2023.12.10 |