2

複雑なタイトルで申し訳ありません。

顧客と注文の 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
4

2 に答える 2

3

まず、 s(name, date)を除いて でグループ化された日付を選択NULLし、一連の異なる名前で結合します。

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 に答える