2012-12-07 5 views
0

인 송장을 찾으려면 Invoice Tablle을 검색하십시오.> 0이고 < 인 인보이스에 대한 인보이스 항목 테이블을 찾으십시오. 인보이스 항목 테이블에는 인보이스의 모든 항목에 대한 세부 정보가 들어 있습니다. 항목> 0 및 <의 모든 인보이스를 제공하는 쿼리를 작성하려면 어떻게합니까?수량이> 0이고 <0

+3

귀하의 질문에 관련 테이블의 스키마를 추가 .. –

+0

은 이제까지 같지 않음 연산자 <>의 heared : 여기

SELECT DISTINCT PosNegInvoices.InvoiceID FROM ItemizedInvoice AS NegInvoices CROSS APPLY ( SELECT InvoiceID FROM ItemizedInvoice WHERE InvoiceID = NegInvoices.InvoiceID AND Quantity > 0 ) AS PosNegInvoices WHERE NegInvoices.Quantity < 0 

는 CTE를 사용하는 또 다른 버전이? – Nicktar

+0

공통 테이블 식을 사용했지만 보고서를 시간 초과로 가져 오는 쿼리를 실행하는 데 오랜 시간이 걸렸습니다. –

답변

0

어때? 두 개의 쿼리를 사용합니다. 첫 번째는 Negative Quantities가있는 모든 송장을 찾습니다. 그런 다음 APPLY는 두 번째 쿼리에서 양수가있는 송장 목록에서만 찾을 수 있습니다.

WITH NegInvoices AS 
(
    SELECT 
    InvoiceID 
    FROM ItemizedInvoice 
    WHERE Quantity < 0 
), 
PosInvoices AS 
(
    SELECT 
    InvoiceID 
    FROM ItemizedInvoice 
    WHERE Quantity > 0 
) 
SELECT DISTINCT 
    PosInvoices.InvoiceID 
FROM NegInvoices 
JOIN PosInvoices 
ON NegInvoices.InvoiceID = PosInvoices.InvoiceID 
+0

답장을 보내 주셔서 감사합니다. 귀하가 권고 한 것과 동일한 CTE를 사용했지만 약 15 분의 시간이 소요되었습니다. 쿼리를 개선하려고합니다. Infact 그 거대한 데이터와 상세한 청구서. –

+0

귀하의 색인은 무엇입니까? InvoiceID 및 Quantity를 포함하는 items 테이블에 클러스터되지 않은 인덱스가 있으면 도움이 될 수 있습니다. 실제로 버전, SQL Server 버전에 따라 네거티브 및 포지티브 조건 각각에 대해 필터링 된 인덱스를 만들 수도 있습니다. – BStateham

관련 문제