2012-07-24 5 views
0

제품별로 그룹화 된 날짜 이전에 이루어진 재고 이동을 추가하고 싶습니다. 문서 유형에 따라 다른 표의 날짜를 확인해야합니다.쿼리의 다른 테이블에서 동일한 조건 확인

기본적으로 송장, 불필요한 인보이스 및 기타 유형의 세 가지 유형의 이동이 있습니다. 해당 문서의 정보는 3 개 테이블에 있습니다

  • 인보이스 :DOC, DATE, ...
  • NULLED_INV :DOC, DATE, ...
  • 기타 :DOC, DATE, ....

그리고 나서 다른 테이블의 모든 움직임을 집결지 :

  • 무브먼트 (PRODUCT_ID, DOC, DOC_TYPE, QUANTITY ...)

그래서 나는에 DOC_TYPE에 따라 해당 테이블에 날짜를 확인해야합니다 움직임의 QUANTITY을 더하기 위해

PRODUCT_ID TOTAL_MOVEMENTS_BEFORE_XXXX 
1001  10 
1002  25 
... 

하나를 : DOC_TYPE = 2 다음 NULLED_INV에서 날짜를 확인하고 DOC_TYPE = 3 경우 다음 OTHERS의 날짜를 확인하고 제품별로 그룹화 된 모든 움직임을 추가하는 경우 DOC_TYPE = 1 다음, INVOICESDOC의 날짜를 확인하는 경우 예를 들어 같은 쿼리를 만드는 방법에 대한 아이디어?

WHERE 절에 IF를 사용해 보았지만 작동하지 않았습니다.

+2

'DocType'이라는 새로운 컬럼을 가진'Invoices' 테이블을 하나만 생성해야합니다. 이 세 개의 테이블 대신 송장 유형을 나타 내기 위해 이름을 'InvoiceType'으로 지정했습니다. 그런 다음이 두 테이블에 대해 쿼리를 작성하는 것이 훨씬 더 쉬울 것입니다. –

+0

감사합니다 Mahmoud, 테이블 INVOICES 테이블에 의해 다른 사람이 공유하지 않는 몇 가지 열이 예를 들어, 그래서 내가 여러 테이블에있는 다른 모든 문서를 포함하는 경우 여러 비어 있고 또한 열을 추가해야 할 것입니다. 인보이스에 사용되지 않는 인보이스, 다른 유형의 문서에만 사용 – ednincer

답변

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 개의 테이블을 하나의 테이블로 병합 할 수 있으며, 세 개의 테이블 모두에서 선택하고자 할 때 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.움직임 FROM total_mov_before 같은 수량) 좌 ( SELECT 문서에 가입 1 ㎛ tdoc로서, 송장 FROM 날짜 UNION ALL SELECT 문서 2 tdoc 같은 널링 UNION FROM 날짜 ALL SELECT 문서 3 tdoc로서 날짜 다른 사람 ) sub ON m.doc = sub.doc 및 m.doc_type = sub.tdoc where sub.date <: beforedate GROUP BY m.product_id – ednincer