2017-12-29 33 views
3

私は2つのテーブル 'authorization'と 'transaction'を持っています。MySQL SUM 0がJOINの結果がないため

承認テーブル

Auth_ID | User_ID | Auth_Hours 
------------------------------- 
5  | 1  | 60 
6  | 2  | 40 
7  | 3  | 50 

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

Auth_ID | User_ID | Used_Hours 
------------------------------- 
5  | 1  | 5 
6  | 2  | 2 
5  | 1  | 20 
6  | 2  | 17 
5  | 1  | 11 
6  | 2  | 9 

は、私は私のクエリは、トランザクション・テーブルからAUTH_IDUSER_IDによってUsed_Hoursとグループを合計します。ここでキャッチだ - 私は、クエリの結果が0で自分のAuth_Hoursのいずれかを使用していないユーザーは、以下を参照してください表示する:

QUERY

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, SUM(t.Used_Hours) 
FROM AUTHORIZATION a 
JOIN TRANSACTION t 
on a.Auth_ID = t.Auth_ID 
and a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 

の実績

Auth_ID | User_ID | Auth_Hours | Total Hours Used 
------------------------------------------------- 
5  | 1  | 60   | 36 
6  | 2  | 40   | 28 

募集結果

Auth_ID | User_ID | Auth_Hours | Total Hours Used 
------------------------------------------------- 
5  | 1  | 60   | 36 
6  | 2  | 40   | 28 
7  | 3  | 50   | 0 

私は質問が比較的簡単だと思います。

+5

質問を編集してクエリを表示してください。その後、 'JOIN'を' LEFT JOIN'に置き換えます。 –

+0

私は私の質問を入力しました。私はLEFT JOINと試してみます –

答えて

1

のショートカットは、両方のテーブルで一致する値を持つレコードを返します。 すべてのレコードを1つのテーブルから取得し、一致するレコードを別のテーブルから返す場合は、外部結合(LEFT [OUTER] JOINまたはRIGHT [OUTER] JOIN)を使用する必要があります。そして、あなたはゼロにNULL秒に変換するためにIFNULL()またはCOALESCE()機能を使用することができます。私は(あなたの例で使用されるような)合計フィールドの名前として空白の文字列を割り当てるために単一引用符を使用

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, IFNULL(SUM(t.Used_Hours), 0) AS 'Total Hours Used' 
FROM authorization a 
LEFT JOIN transaction t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 

お知らせ。これはすべてのデータベースで機能します。 MySQLではバックチックを使用することもできますが、これはMySQLでのみ有効です。

ここにはgood illustration about the different types of joining tablesがあります。

+0

助けてくれてありがとう! IFNULL()はMySQLのISNULL()と同じように見えます。いずれにせよ、あなたは揺れます。あなたがあなたの答えを更新したら、私はそれを受け入れます。 –

+0

はい、MySQLでは 'IFNULL()'関数か 'COALESCE()'関数を使用できます。 –

0

このクエリは、任意のmysqlエンジンまたはバージョンで動作します。このクエリを使用してください:

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, CASE COUNT(t.Used_Hours) WHEN 0 THEN 0 ELSE SUM(t.Used_Hours) END AS 'Total Hours Used' 
FROM authorization a 
LEFT JOIN TRANSACTION t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 
+0

COUNT()は、実際の合計ではなく、インスタンスの数だけを記録します。 –

+0

私はsum(t.Used_Hours)を返します。役に立ったら教えて –

関連する問題