1

支出を記録し、支出カテゴリ情報を提供する次の2つのテーブルがあります。

テーブルトランザクション:

+-------+--------+--------+
| month | cat_id | amount |
+-------+--------+--------+
|     1 |      2 |      3 |
|     1 |      2 |      8 |
|     2 |      1 |      7 |
|     2 |      1 |      5 |
+-------+--------+--------+

テーブルカテゴリ:

+--------+-------------+
| cat_id | cat_desc    |
+--------+-------------+
|      1 | Stock       |
|      2 | Consumables |
+--------+-------------+

私が欲しいのは、次のように、その月のそのカテゴリの支出がない場合でも、各月の各カテゴリの金額の合計を表示するクエリを作成することです。

+-------+-------------+--------+
| month | cat_desc    | amount |
+-------+-------------+--------+
|     1 | Stock       |      0 |
|     1 | Consumables |     11 |
|     2 | Stock       |     12 |
|     2 | Consumables |      0 |
+-------+-------------+--------+

外部結合を使用する必要があると思いますが、それを実行するためのステートメントはまだ見つかりません。

助けてくれてありがとう。

4

3 に答える 3

2

これにより、正しい結果が得られるはずです。内側の select は、すべてのカテゴリを組み合わせたすべての月のリストを準備しLEFT JOIN、残りを処理します。

SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount
FROM (
  SELECT DISTINCT t.month, c.cat_id, c.cat_desc
  FROM categories c
  CROSS JOIN transactions t
) t
LEFT JOIN transactions t2 ON ( t2.month = t.month AND t2.cat_id = t.cat_id )
GROUP BY t.month, t.cat_desc

以下を使用するとパフォーマンスが向上する可能性がありますが (DISTINCT必要な場合にのみ使用)、試してみる必要があります。

SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount FROM (
  SELECT t.month, c.cat_id, c.cat_desc
  FROM
  (SELECT DISTINCT month FROM transactions) t
  CROSS JOIN categories c
) t
LEFT JOIN transactions t2 ON ( t2.month = t.month AND t2.cat_id = t.cat_id )
GROUP BY t.month, t.cat_desc
于 2010-02-12T22:48:43.810 に答える
0
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount) 
FROM categories c 
LEFT JOIN transactions t ON (t.cat_id = c.cat_id)
GROUP BY c.cat_id,t.month
于 2010-02-12T22:32:24.563 に答える
0
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount)  
FROM categories c  
LEFT JOIN transactions t ON (t.cat_id = c.cat_id) 
GROUP BY t.month,c.cat_id 
Order By t.month
于 2010-02-12T22:57:02.010 に答える