我有一个“交易”MySQL表,我记录了我的产品的所有销售和退款。因此,每个记录代表销售或退款(由标志指示),交易ID,交易日期和交易的价值。如果退款,还有一个refund_id,用于指明此退款所针对的交易ID。
我是否可以仅使用一个查询来计算在特定时间段内进行的销售量(如果退款金额低于销售价值则考虑销售)和所赚取的总金额(即销售额减去退款金额) )。
注意:
1.每次销售最多可退款一次
2.如果退款,请记住的日期不是退款的日期(即数据库中记录的特定退款的内容),但原始销售完成时
答案 0 :(得分: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上面的回答,您可以看到自我加入以获得每笔销售的退款。 我不认为小组是必需的。
此解决方案并不会尝试确保每次销售只有一次退款,如果有多次退款,则会影响此解决方案的正确性。
答案 1 :(得分:0)
这可以使用self join与group by
结合使用。