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

これがMySQLでコンパイルされるかどうかは100%確信が持てません。最初に試してください。もしそうなら...素晴らしい...もしそうでなければ、別のアイデアがあるので教えてください。これを取得したら、その通貨の為替レートを掛けます。

編集: 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に 1 つの通貨の種類を指定できtotalます。

于 2012-05-14T22:02:33.477 に答える
0

最小のコード行ではなく、直感的で読みやすいコードを凝縮して、必要に応じて手順をスキップできます

  1. 為替レートをデータベースに入れます。列のロイヤリティ_通貨とエクスレートを持つデータベースにあると仮定しましょう

  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) sales

  3. 販売と返品によるピボットアップ

    (SELECT プロバイダ、ロイヤリティ_通貨、エクスレート CASE sales_or_return WHEN 'S' THEN ロイヤリティ_価格 ELSE 0 AS ロイヤリティ_セールス CASE sales_or_return WHEN 'R' THEN ロイヤリティ_価格 ELSE 0 AS ロイヤリティ_リターン FROM 売上) ピボットされた_売上

  4. 合計を計算する

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

于 2012-05-14T22:17:01.517 に答える