0

製品ごとにグループ化された日付より前に行われた在庫移動を合計したいと思います。ドキュメントの種類に応じて、さまざまなテーブルから日付を確認する必要があります。

基本的に、私には3つのタイプの動きがあります。請求書、無効化された請求書、およびその他のタイプのドキュメントです。これらのドキュメントの情報は、次の3つの表にあります。

  • 請求書: DOC、、DATE...。
  • NULLED_INV: DOC、、DATE...。
  • その他: DOC、、DATE...。

次に、別のテーブルにすべての動きがあります。

  • 動き(、、、、 ... )PRODUCT_ID_DOCDOC_TYPEQUANTITY

ですから、ムーブメントのDOC_TYPE合計を出すために、に応じて対応する表の日付を確認する必要があります。QUANTITYたとえばDOC_TYPE = 1、inの日付をチェックする場合、DOCinのINVOICES日付をチェックインする場合、およびinの日付をチェックインする場合は、製品ごとにグループ化されたすべてのムーブメントを合計します。DOC_TYPE = 2NULLED_INVDOC_TYPE = 3OTHERS

PRODUCT_ID TOTAL_MOVEMENTS_BEFORE_XXXX
1001       10
1002       25
...

そのようなクエリを作成する方法について何かアイデアはありますか?

句でIFを使用しようとしましたWHEREが、機能しませんでした。

4

1 に答える 1

2

最も簡単な解決策は、次の場合に可能UNIONです。

SELECT product_id, count(*) total_movements_before
FROM movements m
LEFT JOIN (
  SELECT doc, date
  FROM invoices
  UNION ALL
  SELECT doc, date
  FROM nulled
  UNION ALL
  SELECT doc, date
  FROM others
) sub
ON m.doc = sub.doc
WHERE sub.date < :beforedate
GROUP BY m.product_id

invoicesただし、追加する必要があります。たとえば、テーブルに列を追加して、タイプを示してみませんか? そうすれば、3 つのテーブルを 1 つにマージでき、3 つUNIONすべてから選択する場合に s を必要としません (例: SELECT * FROM movements m LEFT JOIN invoices i ON m.doc = i.doc AND m.doc_type = i.doc_type)

于 2012-07-24T08:24:05.323 に答える