programing

또한 아이가 없을 때 모든 어린이 콜의 합계

coolbiz 2022. 10. 4. 21:39
반응형

또한 아이가 없을 때 모든 어린이 콜의 합계

MySQL 테이블이 있다products다음과 같이 표시됩니다.

|--------------------|
| id | parent | sold |
|--------------------|
| 1  | 0      | 1    |
| 2  | 1      | 3    |
| 3  | 1      | 0    |
| 4  | 0      | 2    |
|--------------------|

저는 제품이 몇 번 팔렸는지 결과를 알고 싶습니다.제품의 모든 자녀를 합산해야 합니다.sold컬럼도 마찬가지입니다.그래서 저는 다음과 같이 쿼리를 사용하려고 했습니다.

SELECT
    p1.id,
    SUM(p2.sold) + p1.sold AS sold
FROM products p1
JOIN products p2
    ON p2.parent = p1.id
WHERE p1.parent = 0;

하지만 난 이해한다:

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
|-----------|

그래서 첫 번째 레코드에는 잘 어울리죠. 아이가 있지만 네 번째 레코드에는 아이가 없기 때문이죠.예상 결과는 다음과 같습니다.

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
| 4  | 2    |
|-----------|

너는 원한다subquery:

select id, sum(sold) +
           ( select coalesce(sum(p1.sold), 0)
             from products p1
             where p1.parent = p.id
           ) as sold
from products p
where parent = 0
group by id;

추천할 만한 것은left join그리고.group by:

SELECT p1.id,
       (COALESCE(SUM(p2.sold), 0) + p1.sold) AS sold
FROM products p1 LEFT JOIN
     products p2
     ON p2.parent = p1.id
GROUP BY p1.id, p1.sold;

조심하셔야 돼요NULL자녀 없는 부모에 대한 가치관

이 조작은 유효합니다.

select a.id, sum(a.sold+coalesce(b.sold,0)) from products a left join(
select parent, sum(sold) sold
from products group by parent) b on a.id=b.parent
where a.parent=0
group by a.id

왼쪽 외부 결합으로 하고 null 값을 0으로 변경하여 합계가 null로 처리되지 않도록 합니다.

SELECT
    p1.id,
    SUM(COALESCE(p2.sold,0)) + p1.sold AS sold
FROM products p1
LEFT JOIN products p2
    ON p2.parent = p1.id
WHERE p1.parent = 0
GROUP BY p1.id;

전술한 바와 같이, 이 솔루션은 여러 수준의 아이를 다루지 않습니다.

SQLFiddle 라이브 데모

언급URL : https://stackoverflow.com/questions/50532250/sum-of-all-children-cols-also-when-there-is-no-child

반응형