2011-10-10 58 views
0

我有一個「交易」MySQL表,我記錄了我的產品的所有銷售和退款。因此,每條記錄代表銷售或退款(用標記表示),交易編號,交易日期和交易價值。在退款的情況下,還有一個refund_id,用於指明該退款適用於哪個交易ID。銷售和退款表

我可以僅使用一個查詢來計算在特定時間段內銷售了多少(如果退款價值低於銷售價值,則考慮銷售)以及總收入(即銷售額減去退款值)。

備註:
1.每筆銷售最多可以退款一次。
2.在退款的情況下,記住的日期不是退款完成的日期(即記錄在數據庫中的特殊退款的日期),但當原始銷售完成時

回答

1
SELECT SUM(numberofsales) as numberofsales,SUM(salevalue) 
FROM (
--handle sales with refunds 
SELECT count(sales) as numberofsales, sum(sales.value-refunds.value) as salevalue 
FROM Transactions sales 
LEFT JOIN transactions refunds ON sales.transid=refunds.refundid 
WHERE refunds.refundid IS NOT NULL 
AND sales.value-refund.value>0 
AND sales.date>@begindate 
AND sales.date<@enddate 
AND sales.refund_flag='s' 
UNION 
--handle sales without refunds 
SELECT count(sales) as numberofsales, sum(sales.value) as salevalue 
FROM Transactions sales 
LEFT JOIN transactions refunds ON sales.transid=refunds.refundid 
WHERE refunds.refundid IS NULL 
AND sales.date>@begindate 
AND sales.date<@enddate 
AND sales.refund_flag='s') 

這是第一次與解決方案的主要特點。 它使用SQL Server語法,我不確定sql server和mysql之間的區別。

根據michael667的回答以上,你可以看到自我加入以獲得每筆銷售的退款。 我不認爲組是必需的。

此解決方案不會確保每次銷售只有一次退款,並且實際上如果有多個退款,這會影響此解決方案的正確性。

+0

輝煌,指出我在正確的方向! –