1

次のように読みやすい結果セットが得られる、信じられないほど複雑な SQL クエリ (3 つの INNER JOINS) があります (簡略化)。データベースを継承したため、既存のテーブルの構造を変更することは不可能であるため、複雑なクエリを実行してこの時点に到達する必要があります。

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Hardware                102
Software                205
Software                104

次に、単純にGROUP BYproduct_category、product_code を実行すると、関心のある最終的な結果セットのほとんどが得られます。

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Software                205
Software                104

ただし、不足しているのは在庫数です。

product_category    |   product_code    |   num_in_stock
--------------------------------------------------------
Hardware                102                 2
Hardware                104                 1
Software                205                 1
Software                104                 1

COUNT()ステートメントで行われる処理から直接できるようにしたいのでGROUP BY、少し迷っています。

これまでの SQL クエリは次のとおりです。

SELECT categories.product_category, codes.product_code FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

表は次のとおりです。

  • CATEGORIES- 例: 「ハードウェア」、「ソフトウェア」
  • CODES- 例: 100、204 (に属するcategory)
  • PRODUCTS- categories+の組み合わせcodes、役に立たないバージョン #
  • STOCK・商品のエントリー、在庫が複数ある場合は複数エントリーあり

これが非常に厄介なのは、 の役に立たないversion #フィールドが原因ですPRODUCTS。これが意味することは、特定の組み合わせ (例: "Hardware 102")PRODUCTSに対して、それぞれ異なるversion #値で複数回入力できることです。これにより、同じ製品であるにもかかわらず、異なるものSTOCKを参照することになります。 . うーん!idsPRODUCTS

何か案は?

編集:

たとえば、2 つの異なるバージョンを持つ製品「Misc 999」があるとします。これはCATEGORIES、"Misc"のエントリ、 CODES"999"のエントリ ( category_id"Misc" に属するもの)、および 2 つのエントリPRODUCTS(両方とも同じcode_idであるが異なるversion情報を持つ - 私は無視しています) があることを意味します。 .

次に、これらの在庫が 10 個ある場合 (一方のバージョンが 3 個、もう一方のバージョンが 7 個ですが、バージョン情報は無視します)、STOCKテーブルには 10 個のエントリがあり、それぞれがPRODUCTS( id2 つのこの場合は異なる ID)。

4

2 に答える 2

1

count(*)select句に追加するだけです:

SELECT categories.product_category, codes.product_code, count(*) qty_in_stock
FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

ここでSQLFiddle 。

于 2013-10-05T19:39:37.883 に答える