2012-07-24 63 views
0

我想将根据产品分组的日期前的库存移动相加。我必须根据文档类型检查不同表格中的日期。检查查询中不同表格中的相同条件

基本上我有3种类型的动作:发票,无效发票和其他类型的文件。这些文件的信息是在3个表:

  • 发票:DOCDATE,...
  • NULLED_INV:DOCDATE,...
  • OTHERS:DOC,DATE,...

然后我h AVE所有的动作在另一张表:

  • MOVEMENTSPRODUCT_IDDOCDOC_TYPEQUANTITY ...)

所以我需要检查在对应表的日期取决于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,但它不起作用。

+2

您应该只创建一个具有新列“DocType”的“发票”表,如您将其命名为或“InvoiceType”,以指示发票类型而不是这三个表。然后,对这两个表编写查询会容易得多。 – 2012-07-24 08:26:46

+0

谢谢马哈茂德,事情是表INVOICES有几列不被表OTHERS共享的列,所以如果我包括在同一个表中的所有其他文件,我会有几个空,我也不得不添加列不会被发票使用的发票,只适用于其他类型的文件 – ednincer 2012-07-24 17:27:44

回答

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

+0

感谢Knittl,经过小幅改动,效果很好!最终查询: SELECT m.product_id,sum(m。量),为total_mov_before FROM运动中号 LEFT JOIN( 选择DOC,1作为tdoc,日期 FROM发票 UNION ALL 选择DOC,2作为tdoc,日期 FROM清零 UNION ALL 选择DOC,3为tdoc,日期 FROM others )sub ON m.doc = sub.doc和m.doc_type = sub.tdoc WHERE sub.date <:beforedate GROUP BY m.product_id – ednincer 2012-07-28 07:20:49