更有效的SQL查询方式?

时间:2012-05-14 21:58:43

标签: python mysql sql

有没有更好的方法来执行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

3 个答案:

答案 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)

如果需要,可以缩小代码行,但直观且可读,可以跳过步骤

  1. 将汇率放入数据库。让我们假设它在数据库中包含列royalty_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 来自sales_raw INNER JOIN exchange_rates ON sales_raw.royalty_currency = exchange_rates.royalty_currency)销售

  3. 按销售和回报进行转移

    (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

  4. 计算总数

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