Database

[MySQL] 집계 함수 ALL, ANY 구현

비번변경 2023. 11. 20. 15:09

개요

Python에는 여러 데이터에 대한 참, 거짓을 판단할 때 사용할 수 있는 all, any 함수가 존재한다.

참고 : 2022.10.08 - [Python] any/all - 여러 요소의 참/거짓 확인

비슷한 방식으로 MySQL에서 SQL을 이용해 그룹 별 여러 데이터에 대한 참, 거짓을 판단하고 싶다.

 

방법을 알아보자. 참고로 Subquery로 제공되는 ALL, ANY가 아니다.

 

 

예시 테이블

| month | day | amount |
| ----- | --- | ------ |
| 1     | 3   | 9000   |
| 1     | 5   | 8000   |
| 3     | 15  | 20000  |
| 6     | 14  | 110123 |
| 6     | 18  | 3000   |
| 12    | 20  | 101000 |
| 12    | 25  | 123456 |

몇 월 며칠에 판매된 양에 대한 데이터가 저장된 sales 테이블이 있다고 하자.

 

DDL

더보기
CREATE TABLE sales (
  month int, 
  day int, 
  amount int
);

INSERT INTO sales VALUES
(1,3,9000),
(1,5,8000),
(3,15,20000),
(6,14,110123),
(6,18,3000),
(12, 20, 101000),
(12, 25, 123456);

 

 

ANY

예로 들어 달마다 판매량이 10000 초과한 날이 하루라도 있는지 확인하고 싶다.

이런 경우, SUM(조건문) > 0으로 조회하면 된다. 0이면 False, 1이면 True에 해당한다. 예시 테이블의 경우 3월, 6월, 12월에 True로 나와야 한다.

SELECT month, SUM(amount > 10000) > 0
FROM sales
GROUP BY month
;


| month | SUM(amount > 10000) > 0 |
| ----- | ----------------------- |
| 1     | 0                       |
| 3     | 1                       |
| 6     | 1                       |
| 12    | 1                       |

또는 bit_or(조건문)를 사용할 수 있다.

SELECT month, bit_or(amount > 10000)
FROM sales
GROUP BY month
;


| month | bit_or(amount > 10000) |
| ----- | ---------------------- |
| 1     | 0                      |
| 3     | 1                      |
| 6     | 1                      |
| 12    | 1                      |

 

 

 

ALL

반대로 이번에는 매 달의 모든 날의 판매량이 10000 초과인지 확인하고 싶다.

이런 경우 조건을 위반하는 행의 수를 세고, 그 수가 0인지를 확인하면 된다. SUM(NOT(조건문)) = 0 형식으로 조회한다. 예시 테이블의 경우, 3월과 12월에 True로 나와야 한다.

SELECT month, SUM(NOT(amount > 10000)) = 0 
FROM sales 
GROUP BY month
;


| month | SUM(NOT(amount > 10000)) = 0 |
| ----- | ---------------------------- |
| 1     | 0                            |
| 3     | 1                            |
| 6     | 0                            |
| 12    | 1                            |

또는 bit_and(조건문)을 사용할 수 있다.

SELECT month, bit_and(amount > 10000) 
FROM sales 
GROUP BY month
;


| month | bit_and(amount > 10000) |
| ----- | ----------------------- |
| 1     | 0                       |
| 3     | 1                       |
| 6     | 0                       |
| 12    | 1                       |

 

 

 

참고 문서

https://dev.mysql.com/blog-archive/using-the-aggregate-functions-any-some-every-with-mysql/

 

 

728x90