sourcecode

WHERE 절에서 mysql SUM()을 사용합니다.

copyscript 2022. 9. 5. 23:13
반응형

WHERE 절에서 mysql SUM()을 사용합니다.

내가 이 테이블을 가지고 있다고 가정해봐

id | cash 
1    200
2    301
3    101
4    700

이전 현금의 합계가 특정 값보다 큰 첫 번째 행을 반환하고 싶습니다.

예를 들어 이전 현금의 합계가 500보다 큰 첫 번째 행을 반환하려면 3행으로 반환해야 합니다.

mysql 문을 사용하여 이 작업을 수행하려면 어떻게 해야 합니까?

사용.WHERE SUM(cash) > 500동작하지 않다

HAVING 절에서는 비교를 위해 집계를 사용할 수 있습니다.

GROUP BY ...
  HAVING SUM(cash) > 500

HAVING절에서는 GROUP BY 절을 정의해야 합니다.

이전 현금의 합계가 특정 값보다 큰 첫 번째 행을 얻으려면 다음을 사용합니다.

SELECT y.id, y.cash
  FROM (SELECT t.id,
               t.cash,
               (SELECT SUM(x.cash)
                  FROM TABLE x
                 WHERE x.id <= t.id) AS running_total
         FROM TABLE t
     ORDER BY t.id) y
 WHERE y.running_total > 500
ORDER BY y.id
   LIMIT 1

집약함수는 서브쿼리에서 발생하므로 집약함수의 컬럼에일리어스는 WHERE 절에서 참조할 수 있습니다.

테스트는 안 했는데, 거의 다 된 것 같은데?

SELECT m1.id
FROM mytable m1
INNER JOIN mytable m2 ON m1.id < m2.id
GROUP BY m1.id
HAVING SUM(m1.cash) > 500
ORDER BY m1.id
LIMIT 1,2

이전 행의 모든 합계를 계산하고 이전 행의 합계가 500보다 큰 행만 얻은 후 하나를 건너뛰고 다음 행을 반환합니다.

일반적으로, 의 상태는WHERESQL 쿼리의 절은 하나의 행만 참조할 수 있습니다.의 컨텍스트WHERE명령어가 정의되기 전에 절이 평가됩니다.ORDER BYRDBMS 테이블에는 암묵적인 순서가 없습니다.

파생 테이블을 사용하여 각 행을 보다 작은 행 그룹에 결합할 수 있습니다.id각 합계 그룹의 합계를 산출합니다.그런 다음 합계가 기준에 부합하는지 검사합니다.

CREATE TABLE MyTable ( id INT PRIMARY KEY, cash INT );

INSERT INTO MyTable (id, cash) VALUES
  (1, 200), (2, 301), (3, 101), (4, 700);

SELECT s.*
FROM (
  SELECT t.id, SUM(prev.cash) AS cash_sum
  FROM MyTable t JOIN MyTable prev ON (t.id > prev.id)
  GROUP BY t.id) AS s
WHERE s.cash_sum >= 500
ORDER BY s.id
LIMIT 1;

출력:

+----+----------+
| id | cash_sum |
+----+----------+
|  3 |      501 |
+----+----------+

집약 함수를 사용하여 필터링하는 경우 HAVING 문을 사용해야 합니다.

SELECT *
FROM tblMoney
HAVING Sum(CASH) > 500

언급URL : https://stackoverflow.com/questions/3284409/use-mysql-sum-in-a-where-clause

반응형