複雑なタイトルで申し訳ありません。
顧客と注文の 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と一致しなかった場合、null行が表示されませんでした。たとえば、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
そのため、代わりに結合に適用する場所を変更しました。これは正常に機能し、null 行が表示されます。したがって、この例では次のようになります。
name | date | count
a | 01/01/2012 | 3
b | null | 1
b | 01/01/2012 | 3
c | null | 1
しかし、名前には異なる cid があるため、名前自体に注文の行がある場合でも、null 行が表示されます。これは望ましくありません。
したがって、同じ名前を共有する他のcidにも注文に行がない場合にのみ、null行が返されるようにする方法を探しています。
助けてくれてありがとう。
- -編集 - -
null 行のカウントを編集しましたが、count は null ではなく 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