0

私は2つのテーブルを持っています:

親子「カテゴリ」:

id    name         parent_id
1     Food         NULL
2     Pizza        1
3     Pasta        2

「取引」:

id     amount      category_id
1      100         1
2      50          2
3      25          2

すべてのカテゴリと 2 つの合計列を返したい:

total = この category_id を持つすべてのトランザクションの合計金額

parentTotal = 合計 + そのすべての子カテゴリの合計

例 (上記の表を使用):

id    name         parent_id    total    parentTotal
1     Food         NULL         100      175
2     Pizza        1            0        0
3     Pasta        2            75       0

編集:

コードが更新され (以下の Nedret Recep のコードに基づく)、正常に動作します...

SELECT 
    tmp1.id, tmp1.name, tmp1.parent_id, tmp1.total, IFNULL(tmp1.total, 0) + IFNULL(tmp2.s, 0)  AS parenttotal
   FROM
        (SELECT
                ca.id, ca.name, ca.parent_id, SUM(tr.amount) as total
        FROM
            categories ca

        LEFT JOIN
                transactions tr
        ON
                tr.category_id = ca.id 
        GROUP BY
                ca.id)
    AS tmp1     

LEFT JOIN 
        (SELECT
            c.id, c.parent_id as categoryid, SUM(t.amount) AS s  
        FROM
            transactions t
        RIGHT JOIN
            categories c
        ON
            t.category_id = c.id
        GROUP BY 
            c.parent_id)
    AS tmp2

ON tmp2.categoryid = tmp1.id 

order by coalesce(tmp1.parent_id, tmp1.id), tmp1.parent_id

助けていただければ幸いです - ありがとう!

4

1 に答える 1

0

1 つの内部結合を使用して、標準であるカテゴリの合計を計算します。次に、別の内部結合を使用して合計を計算しますが、今回はparent_idでグループ化します. 次に、2 つの結果テーブルを結合して、両方の合計を 1 行に表示します。このクエリは大きなテーブルでは遅くなるため、アプリケーション レベルでの別のアプローチの方が適切です。

  SELECT 
        tmp1.id, tmp1.name, tmp1.parent_id, tmp1.total, tmp1.total + tmp2.s AS parenttotal
   FROM
   (SELECT
        ca.id, ca.name, ca.parent_id, SUM(tr.amount) as total
   FROM
        transactions tr
   INNER JOIN
        categories ca
   ON
        tr.categoru_id = ca.id 
   GROUP BY
        ca.id)AS tmp1     
   LEFT OUTER JOIN 
   (
   SELECT
     c.parent_id as categoryid, SUM(t.amount) AS s  
   FROM
      transactions t
   INNER JOIN
      categories c
   ON
      t.category_id = c.i
   GROUP 
       BY c.id ) AS tmp2
   ON
       tmp2.categoryid = tmp.id 
于 2012-08-04T17:04:53.790 に答える