有没有更好的方法来执行sales - returns = total
的以下计算?
exchange_rates = self.rates_dict
self.DBConnection.cursor.execute("SELECT royalty_price, royalty_currency FROM sales_raw WHERE provider='%s' AND sales_or_return = 'S' AND date='%s'"%(provider, self.date))
data = list(self.DBConnection.cursor.fetchall())
sales_in_usd = sum(float(price) * exchange_rates[currency] for price, currency in data)
self.DBConnection.cursor.execute("SELECT royalty_price, royalty_currency FROM sales_raw WHERE provider='%s' AND sales_or_return = 'R' AND date='%s'"%(provider, self.date))
data = list(self.DBConnection.cursor.fetchall())
returns_in_usd = sum(float(price) * exchange_rates[currency] for price, currency in data)
total_in_usd = sales_in_usd - returns_in_usd
答案 0 :(得分:4)
SELECT
royalty_currency,
SUM (
CASE sales_or_return
when 'R' then royalty_price * -1
else royalty_price
) as TotalSales
WHERE provider=%s AND date = %s AND sales_or_return IN ('S', 'R')
GROUP BY royalty_currency
我不是百分百肯定这会在MySQL上编译首先尝试它。如果它确实......很棒......如果没有,请告诉我,因为我有另一个想法。一旦得到这个,乘以该给定货币的汇率。
编辑:根据@ ypercube的建议添加AND sales_or_return IN ('S', 'R')
。此外,这假设所有货币都相同。您仍然需要根据汇率迭代结果。如果汇率存储在数据库中,那么您可以加入汇率表中的数据。我不是一个优秀的会计师,我不知道你是否想要在出售时记录汇率,或者如果一切都按当前汇率计算。我的假设是,此时,您正在计算您通过网络服务获得的当前汇率的销售额。
另一种查询可能是:
SELECT sales.royalty_currency, sales.GrossSales, returns.GrossReturns, sales.GrossSales - returns.GrossReturns,
(SELECT sum(royalty_price) GrossSales, royalty_currency
FROM sales_raw
WHERE provider=%s AND sales_or_return = 'S' AND date=%s) sales
JOIN
(SELECT sum(royalty_price) GrossReturns, royalty_currency
FROM sales_raw
WHERE provider=%s AND sales_or_return = 'R' AND date=%s) returns
on sales.royalty_currency = returns.royalty_currency
这个也可能更精致一点。它还会为您提供其他可能对其他报告用途有用的信息。
答案 1 :(得分:3)
当然,让数据库完成工作(直接在sql语句中使用sum
)。
编辑:您可以group by
种货币类型为每种货币类型设置一个total
。
答案 2 :(得分:0)
如果需要,可以缩小代码行,但直观且可读,可以跳过步骤
将汇率放入数据库。让我们假设它在数据库中包含列royalty_currency和exrate
使用sales_raw表
加入汇率表(SELECT sales_raw.provider,sales_raw.royalty_price,sales_raw.royalty_currency,sales_raw.sales_or_return,exchange_rates.exrate 来自sales_raw INNER JOIN exchange_rates ON sales_raw.royalty_currency = exchange_rates.royalty_currency)销售
按销售和回报进行转移
(SELECT提供者,royalty_currency,exrate CASE sales_or_return当'''那么royalty_price ELSE 0作为royalty_sales CASE sales_or_return当'R'那么royalty_price ELSE 0作为royalty_returns 来自销售)pivoted_sales
计算总数
SELECT SUM(royalty_sales * exrate) - SUM(royalty_returns * exrate)AS total_sum FROM pivoted_sales