0

mysql クエリに関して簡単な質問をしたいと思います。

trans という名前のテーブルがあります。

+----+---------------------+------+-------+----------+----------+
| ID | Date                | User | PCNum | Customer | trans_In |
+----+---------------------+------+-------+----------+----------+
|  8 | 2013-01-23 16:24:10 | test | PC2   | George   |       10 |
|  9 | 2013-01-23 16:27:22 | test | PC2   | Nick     |        0 |
| 10 | 2013-01-24 16:28:48 | test | PC2   | Ted      |       10 |
| 11 | 2013-01-25 16:36:40 | test | PC2   | Danny    |       10 |
+----+---------------------+------+-------+----------+----------+

および別の名前の customers :

+----+---------+-----------+
| ID | Name    | Surname   |
+----+---------+-----------+
|  1 | George  |           |
|  2 | Nick    |           |
|  3 | Ted     |           |
|  4 | Danny   |           |
|  5 | Alex    |           |
|  6 | Mike    |           |
   .
   .
   .
   .
+----+---------+-----------+

日付範囲内の特定の顧客の trans_in 列の合計を表示したいのですが、選択した日付範囲にレコードがない顧客も結果セットに含めます。trans_in の合計は NULL または 0 として表示される可能性がありますが、問題ではありません...

次のクエリがあります。

SELECT
  `Date`,
  Customer,
  SUM(trans_in) AS 'input'
FROM trans
WHERE Customer IN('George','Nick','Ted','Danny')
    AND `Date` >= '2013-01-24'
GROUP BY Customer
ORDER BY input DESC;

しかし、これは 'Ted' と 'Danny' の合計のみを返します。これは、1 月 24 日以降のトランザクションしかないためです...

WHERE IN (...) 関数内にあるすべての顧客を含めるにはどうすればよいですか?選択した日付範囲にトランザクションがない顧客も含めて??

どうにかして顧客テーブルに参加させる必要があると思いますが、その方法がわかりません。

前もって感謝します!!

:)

4

2 に答える 2

2

別のテーブルのレコードと一致せずに、あるテーブルのすべてのレコードを含めるには、LEFT JOIN を使用する必要があります。

SELECT
  t.`Date`,
  c.name,
  SUM(t.trans_in) AS 'input'
FROM customers c LEFT JOIN trans t ON (c.name = t.Customer AND t.`Date` >= '2013-01-24')
WHERE c.name IN('George','Nick','Ted','Danny')
GROUP BY c.name
ORDER BY input DESC;

もちろん、関連するテーブルでは名前ではなく、ID で顧客を参照する必要があることに注意してください。現在の設定では情報の重複が生じます。顧客が名前を変更した場合、customer テーブルだけでなく、trans テーブルのすべての関連レコードを更新する必要があります。

于 2013-01-30T12:42:26.700 に答える
0

これを試して

 SELECT

 `Date`,
 Customer,
 SUM(trans_in) AS 'input'
 FROM trans
 inner join customers
 on customers.Name = trans.Customer
 WHERE Customer IN('George','Nick','Ted','Danny')

 GROUP BY Customer
 ORDER BY input DESC;
于 2013-01-30T12:50:14.957 に答える