1

顧客とアイテムの2つのテーブルをクロス結合しようとしているので、アイテムごとのレポートで顧客ごとの売上を作成できます。私は2000の顧客と2000のアイテムを持っています。

SELECT customer_name FROM customers; --Takes 100ms

SELECT item_number FROM items; --Takes 50ms

SELECT customer_name, item_number FROM customers CROSS JOIN items; Takes 200000ms

これが400万行であることは知っていますが、これをさらに高速に実行することは可能ですか?最終的には、次のような販売テーブルに参加したいと思います。

SELECT customer_name, item_number, sales_total FROM customers CROSS JOIN items LEFT JOIN sales ON (customer.customer_name = sales.customer_name, item.item_number=sales.item_number);

販売テーブルには明らかにすべての顧客またはすべてのアイテムが含まれるわけではないため、ここでの目標は、すべての顧客とすべてのアイテムを、販売されたものと販売されなかったものとともに表示するレポートを作成することです。

PostgreSQL8.4を使用しています

4

5 に答える 5

5

あなたの質問に答えるために:いいえ、それより速くクロスジョインを行うことはできません-もし可能であれば、それがクロスジョインの実装方法になります。

しかし、実際にはクロスジョインは必要ありません。おそらく、2つの別々のクエリが必要になります。1つはすべての顧客を一覧表示し、もう1つはすべてのアイテムとそれらが販売されたかどうかを一覧表示します。

于 2010-01-14T19:56:36.157 に答える
1

これは実際には複数のレポートである必要があります。情報のより効率的なパッケージ化をもたらす、頭のてっぺんからいくつかのことを考えることができます。

  1. レポート:顧客/アイテムごとのすべての購入の数(明らか)。
  2. レポート:顧客が購入していないすべてのアイテムのリスト。
  3. レポート:どの顧客に焦点を当てるかを優先するためのレポート#2(アイテム数)の要約。
  4. レポート:アイテムごとに購入していないすべての顧客のリスト。
  5. レポート:レポート#3(顧客数)の要約。これにより、最も人気のあるアイテムと人気のないアイテムの両方を特定して、さらにアクションを実行できます。
  6. レポート:過去にアイテムを購入したが、レポート期間に購入しなかったすべての顧客のリスト。このレポートは、販売テーブルに日付があり、顧客が通常の購入者(つまり、使い捨てウィジェット)であると予想される場合にのみ関連します。サービス契約などではうまく機能しません。

ここでのポイントは、ツールがすべての可能な結果を​​一度に処理し、より多くのデータを生成することを主張するべきではなく、誰もが手動でダイジェストする可能性があるということです。データのエンドユーザーと消費者に彼らのニーズが何であるかについて関与させ、それらのニーズを満たすように出力を調整する必要があります。それは長期的には双方の生活をはるかに楽にするでしょう。

于 2010-01-19T18:25:36.810 に答える
0

これに対するサードパーティのソリューションがあるとは想像できません。PostgreSQLプログラマーはシステムを最もよく知っており、システムを大幅に最適化します。

于 2010-01-14T19:57:39.543 に答える
0

特定のクライアントのすべてのアイテムを表示したい場合(cientにアイテムがない場合でも)、私はむしろ試してみます

SELECT c.customer_name, i.item_number, s.sales_total
FROM customers c LEFT JOIN 
    sales s ON c.customer_name = s.customer_name LEFT OIN
    items i on i.item_number=s.item_number

これにより、すべてのクライアントと、販売によって結合されたすべてのアイテムのリストが表示されます。

于 2010-01-14T19:59:24.090 に答える
0

おそらくあなたはこのようなものが欲しいですか?

select c.customer_name, i.item_number, count( s.customer_name ) as total_sales
from customers c full join sales s on s.customer_name = c.customer_name
full join items i on i.item_number = s.item_number
group by c.customer_name, i.item_number
于 2014-02-16T20:21:31.853 に答える