2014-11-08 130 views
1

我有3个表格,即客户,信用和付款。我希望在@StartDate和@EndDate之间获得客户所做的所有付款和积分。这是我的查询:左加入多个条件

SELECT   Client.Name, Payment.PaymentAmount, Credit.CreditAmount 
FROM   Client 

LEFT JOIN Payment 
ON Client.ClientID = Payment.ClientID 
LEFT JOIN Credit 
ON Client.ClientID = Credit.ClientID 

WHERE  (Payment.Date BETWEEN @StartDate AND @EndDate) AND (Client.Date BETWEEN @StartDate AND @EndDate) 
ORDER BY Client.CName 

我想说明,即使款项已经不反对它的信用和NULL作出付款的全部学分,反之亦然。但我无法得到它,因为它只显示当天有信用和付款的客户。

我试过OR而不是AND(与'WHERE')但它不起作用。

回答

2

你可以得到你想要的东西通过移动条件的on条款:

SELECT c.Name, p.PaymentAmount, cr.CreditAmount 
FROM Client c LEFT JOIN 
    Payment p 
    ON c.ClientID = p.ClientID AND p.Date BETWEEN @StartDate AND @EndDate LEFT JOIN 
    Credit cr 
    ON c.ClientID = cr.ClientID AND cr.Date BETWEEN @StartDate AND @EndDate 
ORDER BY c.CName; 

但是,我不知道这是你真的什么,因为它是做一个笛卡尔积支付和信用之间,在这段时间内多于一个。

这可能就是更接近你真正想要的东西:

SELECT c.Name, p.PaymentAmount, NULL as CreditAmount 
FROM Client c LEFT JOIN 
    Payment p 
    ON c.client_id = p.ClientId AND p.Date BETWEEN @StartDate AND @EndDate 
UNION ALL 
SELECT c.Name, NULL, c.CreditAmount 
FROM Client c LEFT JOIN 
    Credit cr 
    ON c.ClientID = cr.ClientID AND cr.Date BETWEEN @StartDate AND @EndDate 
ORDER BY Name; 
+0

感谢的人,这为我工作。 – 2014-11-08 17:59:57