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 |
+----+---------------------+------+-------+----------+----------+

和另一个命名的客户:

+----+---------+-----------+
| 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 引用客户,而不是在相关表中按名称。您当前的设置会导致信息重复。如果客户更改了他们的姓名,您现在必须更新 trans 表中的所有相关记录,而不仅仅是在 customer 表中。

于 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 回答