我想在按产品分组的日期之前添加库存移动。我必须根据文档类型检查不同表中的日期。
基本上我有3种类型的动作:发票,无效发票和其他类型的文件。这些文件的信息分为3个表格:
DOC
,DATE
,.... DOC
,DATE
,.... DOC
,DATE
,.... 然后我把所有的动作都放在另一张桌子里:
PRODUCT_ID
,DOC
,DOC_TYPE
,QUANTITY
...)所以我需要根据DOC_TYPE
检查相应表格中的日期,以便合计一个动作的QUANTITY
。例如,如果DOC_TYPE = 1
然后检查DOC
中INVOICES
的日期,如果DOC_TYPE = 2
,则检查NULLED_INV
中的日期以及DOC_TYPE = 3
是否{}检查OTHERS
中的日期,并按产品分组所有动作:
PRODUCT_ID TOTAL_MOVEMENTS_BEFORE_XXXX
1001 10
1002 25
...
如何进行此类查询?
我尝试在WHERE
子句中使用IF,但它没有用。
答案 0 :(得分: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
表?这样,您可以将三个表合并为一个,并且当您要从所有三个表中选择时不需要UNION
(例如SELECT * FROM movements m LEFT JOIN invoices i ON m.doc = i.doc AND m.doc_type = i.doc_type
)