2014-11-22 51 views
0

考慮以下模式:與計數conditition加入

表發票:

Id|TotalSum|Status

1|12|1

1|13|0

表ClientInvoices:

Id|ClientId|InvoiceId

表「發票」可能包含多張發票使用相同的ID,但具有不同的狀態(有關於ID和狀態的唯一約束)。狀態是整數,表示枚舉(0 - 不活動,1 - 激活)

我想所有價格變動的客戶發票如有:

ClientId|InvoiceId|SumBefore|SumAfter

如果再沒有非活動的發票PreviousPrice應該爲空。我想這一點使用下面的查詢來實現:

SELECT Clients.Id AS ClientId, 
Invoice.Id AS InvoiceId, 
ActualInvoice.TotalSum AS SumBefore, 
InActiveInvoice.TotalSum AS SumAfter 
FROM Invoices 
LEFT JOIN ClientInvoices AS ActualInvoice ON ActualInvoice.InvoiceId AND Status = 1 
LEFT JOIN ClientInvoices AS Inactive ON ActualInvoice.InvoiceId AND Status = 0 
LEFT JOIN Clients ON Clients.Id = ClientInvoices.ClientId 

這種運作良好,如果有兩個記錄,一個發票:過去(inative)和電流。但是,如果只有一張發票 - 它具有活動狀態,並且使用上面的查詢,我會得到SumBefore = null和SumAfter =值應該在SumBefore列中。

如果我可以指定條件加入記錄,如果該記錄的行數爲f.e.這可能嗎?

+0

可以使用ISNULL – mxix 2014-11-22 17:58:42

+0

是的,你可以...你可以分使用[HAVING子句]查詢(http://www.w3schools.com/sql/ sql_having.asp) – 2014-11-22 18:00:38

+0

我會從'Invoices'的左連接開始,在左邊你持有'status = 1'和'status = 0'。然後加入結果'ClientInvoices' 我想這應該讓你正確對齊的款項: '選擇 a.InvoiceId爲InvoiceId, a.TotalSum爲SumBefore, b.TotalSum作爲SumAfter 從 發票左連接發票b上a.InvoiceId = b.InvoiceId 和a.status = 1和b.status = 0' 然後您可以將結果加入ClientsInvoices – benji 2014-11-22 18:01:55

回答

1

我認爲這應該工作:

select c.ClientId as ClientId, 
a.InvoiceId as InvoiceId, 
a.TotalSum as SumBefore, 
b.TotalSum as SumAfter 
from Invoices a left join Invoices b 
on a.InvoiceId = b.InvoiceId 
and a.status = 1 and b.status = 0 
join ClientsInvoices c on c.InvoiceId = a.InvoiceId