2

有没有更好的方法来进行以下计算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
4

3 回答 3

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

我不是 100% 确定这会在 MySQL 上编译,首先尝试一下。如果是...很好...如果不是,请告诉我,因为我有另一个想法。一旦你得到这个,乘以给定货币的汇率。

编辑:AND sales_or_return IN ('S', 'R')根据@ypercube 的建议添加。此外,这假设所有货币都是相同的。您仍然需要根据他们的汇率迭代结果。如果汇率存储在数据库中,那么您可以在汇率表中加入数据。作为一名出色的会计师,我不知道您是否想在销售时获取汇率,或者是否所有内容都按照当前汇率计算。我的假设是,此时,您正在根据您通过 Web 服务获得的当前汇率计算销售额。

另一种查询可能是:

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

这个也可以再完善一点。它还可以为您提供一些其他信息,这些信息可能对其他报告目的有用。

于 2012-05-14T22:09:31.977 回答
3

当然,让数据库完成工作(通过sum直接在您的 sql 语句中使用)。

编辑:您可以group by使用货币类型为total每种货币类型设置一个。

于 2012-05-14T22:02:33.477 回答
0

不是最少的代码行,而是直观和可读的,如果需要,可以压缩以跳过步骤

  1. 将汇率放入您的数据库中。让我们假设它在数据库中的列royal_currency 和 exrate

  2. 将汇率表与 sales_raw 表连接起来

    (SELECT sales_raw.provider, sales_raw.royalty_price, sales_raw.royalty_currency, sales_raw.sales_or_return, exchange_rates.exrate FROM sales_raw INNER JOIN exchange_rates ON sales_raw.royalty_currency = exchange_rates.royalty_currency) 销售额

  3. 以销售和退货为轴心

    (选择供应商,版税_货币,exrate CASE sales_or_return WHEN 'S' THEN Royalty_price ELSE 0 AS 版税_sales

  4. 计算总数

    SELECT SUM(royalty_sales * exrate) - SUM(royalty_returns * exrate) AS total_sum FROM pivoted_sales

于 2012-05-14T22:17:01.517 回答