2

抱歉标题复杂。

我有两张桌子,客户和订单:

客户 - 名称可能重复,ID 是唯一的:

name | cid
 a   |  1
 a   |  2
 b   |  3
 b   |  4
 c   |  5

订单 - pid 是唯一的,加入 cid:

pid | cid | date
 1  |  1  | 01/01/2012
 2  |  1  | 01/01/2012
 3  |  2  | 01/01/2012
 4  |  3  | 01/01/2012
 5  |  3  | 01/01/2012
 6  |  3  | 01/01/2012

所以我用这段代码来计算:

select customers.name, orders.date, count(*) as count
from customers
left JOIN orders ON customers.cid = orders.cid
where date between '01/01/2012' and '02/02/2012'
group by name,date

当客户的 cid 与订单中的 cid 不匹配时,它工作正常但没有给我空行,例如 name-c、id-5

select customers.name, orders.date, count(*) as count
from customers
left JOIN orders ON customers.cid = orders.cid
AND date between '01/01/2012' and '02/02/2012'
group by name,date

因此,我更改了应用于联接的位置,效果很好,它给了我空行。所以在这个例子中我会得到:

name | date       | count
 a   | 01/01/2012 | 3
 b   | null       | 1
 b   | 01/01/2012 | 3
 c   | null       | 1

但是因为名称有不同的 cid,所以即使名称本身确实有订单行,它也会给我一个空行,这是我不想要的。

因此,我正在寻找一种方法,仅当共享相同名称的任何其他 cid 也没有订单中的任何行时才返回空行。

谢谢你的帮助。

- -编辑 - -

我已经编辑了空行的计数,计数从不返回空值而是 1。

的结果

select * from (select customers.name, orders.date, count(*) as count
from customers
left JOIN orders ON customers.cid = orders.cid
AND date between '01/01/2012' and '02/02/2012'
group by name,date) as t1 group by name

name | date       | count
 a   | 01/01/2012 | 3
 b   | null       | 1
 c   | null       | 1
4

2 回答 2

3

首先,选择按 分组的日期(name, date),不包括NULLs,然后加入一组不同的名称:

SELECT names.name, grouped.date, grouped.count
FROM ( SELECT DISTINCT name FROM customers ) as names
LEFT JOIN (
  SELECT customers.name, orders.date, COUNT(*) as count
  FROM customers
  LEFT JOIN orders ON customers.cid = orders.cid
  WHERE date BETWEEN '01/01/2012' AND '02/02/2012'
  GROUP BY name,date
) grouped
ON names.name = grouped.name
于 2012-09-01T13:24:26.453 回答
0

最好的方法是根据 Cid 和其他参数将它们组合在一起。因此,您将获得基于 Left Outer Join 的具有 NULL 值的正确输出。

于 2012-09-01T13:23:43.250 回答