집계 MySQL 함수는 항상 단일 행을 반환합니까?
-
19-09-2019 - |
문제
이것이 정말로 기본이라면 죄송하지만 :
나는 어느 시점 에서이 문제가 없었고 지금은 전적으로 다른 일을하고 있거나 구문이 한 단계를 건너 뛰었습니다.
예를 들어, 해당 열 중 하나의 총 하나의 다른 열과 함께 특정 데이터가있는 모든 행을 반환 해야하는 쿼리가 있습니다. 예상대로 일이 효과가 있다면 다음과 같습니다.
SELECT
order_id,
cost,
part_id,
SUM(cost) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
그리고 나는 순서로 모든 행을 얻을 것입니다. 나는 총계가 매번 동일하다는 것을 알고 있지만 그것은 예상됩니다. 지금 그것을 사용하기 위해 지금 사용하고 있습니다.
SELECT
order_id,
cost,
part_id,
(SELECT SUM(cost)
FROM orders
WHERE order_date BETWEEN xxx AND yyy) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
기본적으로 다른 데이터에 대해 총 1 회 동일한 쿼리를 한 번, 한 번에 두 번 실행합니다. 하지만 제가 합계를 원한다면, 평균 비용을 원한다면 평균 비용을 3 번 똑같은 쿼리를 할 것입니다. 실수.
모든 도움은 정말 감사합니다.
해결책
사용해야합니다 GROUP BY
원하는 결과를 얻기 위해 :
SELECT
order_id,
part_id,
SUM(cost) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
GROUP BY order_id, part_id
이것은 당신의 결과를 그룹화합니다. 내가 그것을 가정하기 때문에 주목하십시오 order_id
그리고 part_id
복합 PK입니다. SUM(cost)
위의 일은 아마도있을 것입니다 = cost
(고유 한 두 분야의 조합으로 그룹화하기 때문에 아래의 상관 관계 하위 쿼리는이 제한을 극복 할 것입니다).
비 응집 적 행이 가져온 모든 행은 GROUP BY
열.
자세한 내용은 GROUP BY
여기:
편집하다: 열을 집계 및 응집료로 모두 사용하려는 경우 그룹을 분리 해야하는 경우 하위 쿼리를 사용해야합니다.
SELECT
or1.order_id,
or1.cost,
or1.part_id,
(
SELECT SUM(cost)
FROM orders or2
WHERE or1.order_id = or2.order_id
GROUP BY or2.order_id
) AS total
FROM orders or1
WHERE or1.order_date BETWEEN xxx AND yyy
제휴하지 않습니다 StackOverflow