2011-10-10 93 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

辉煌,指出我在正确的方向! –