2012-02-22 11 views
1

すべての列の合計を取得するにはどうすればよいですか?下のようなテーブルがあるとします。私のクエリは、総コストと純利益を取得します。 2番目のクエリを作成せずに「合計」合計を計算するにはどうすればよいですか。列の総和

Date  rate  supplyfee  demandfee  chargedfee othersTotalcosts netReturn 
2010-01-10 1,339.00 2,150.00  10,000.00  120,000.00  1,085.78  1,064.22 
2011-01-01 3,339.00 1,150.00  1,100.00  150,000.00  1,144.13  5.87 
*Total*    3,300.00  2,100.00 

総コストはsum(chargedfee + others)/rate + demandfeeによって計算され、純収益はsupplyfee - totalcostsによって計算されます。

以下のクエリは、総コストを計算します。

SELECT date 
     , rate 
     , supply_fee 
     , demand_fee 
     , charged_fee 
     , (charged + others/rate) + demandfee AS totalcosts 
     , supplyfee-((charged + others/rate) + demandfee AS net returns 

FROM financies 
WHERE date BETWEEN '2010-01-10' AND '2011-01-01' 
+0

あなたのポストを再フォーマットしようとしましたが、 ''返品のように '' '2010-01-10 AND' '2011-01-01''は正しく見えず、あなたはただ一つしか閉じずに二つのかっこを開きます... –

+0

投稿を再投稿しました投稿者はその1つを見ました – smilezjim

+0

あなたの公式は明確にする必要があります、実際にはあまり意味がありません –

答えて

2

これは複雑に見えますが、しかし私と一緒に耐える。 others/rateが何を意味するのかを明確にする必要がありますが、原理は健全です。あなたが使用できる財務上の主キーを持っている場合、よりエレガントな(GROUP BY ... ROLLUP)ソリューションが実行可能かもしれませんが、信頼性の高いアドバイスを提供するのに十分な経験がありません。ここで私がどのように問題に対処するのかを説明します。

最も外側に最も内側の問合せから作業長ったらしいオプション

(
    SELECT 
     financesTallied.date, 
     financesTallied.rate, 
     financesTallied.supply_fee, 
     financesTallied.demand_fee, 
     financesTallied.charged_fee, 
     financesTallied.total_costs, 
     financesTallied.net_return 

    FROM (

     SELECT 
      financeWithNetReturn.*, 
      @supplyFee := @supplyFee + financeWithNetReturn.supply_fee, 
      @demandFee := @demandFee + financeWithNetReturn.demand_fee, 
      @charedFee := @charedFee + financeWithNetReturn.charged_fee 
     FROM 
     (// Calculate net return based off total costs 
      SELECT 
       financeData.*, 
       financeData.supply_fee - financeData.total_costs AS net_return 
      FROM 
      (// Select the data 
       SELECT 
        date, 
        rate, 
        supply_fee, 
        demand_fee, 
        charged_fee, 
        (supply_fee+demand_fee+charged_fee)/rate AS total_costs // need clarification on others/rate 
       FROM financies 
       WHERE date BETWEEN '2010-01-10' AND '2011-01-01' 
       ORDER BY date ASC 
      ) AS financeData 
     ) AS financeWithNetReturn, 
     (
      SELECT 
       @supplyFee := 0 
       @demandFee := 0 
       @charedFee := 0 
     ) AS variableInit 
    ) AS financesTallied 
) UNION (
    SELECT 
     '*Total*', 
     NULL, 
     @supplyFee, 
     @demandFee, 
     @chargedFee, 
     NULL, 
     NULL 
) 

。このクエリは基本料金を選択し、この行のtotal_costsを計算します。このtotal_costsの計算式は、あなたが探していたものについて100%明確ではないので、調整が必要です。

  SELECT 
       date, 
       rate, 
       supply_fee, 
       demand_fee, 
       charged_fee, 
       (supply_fee+demand_fee+charged_fee)/rate AS total_costs // need clarification on others/rate 
      FROM financies 
      WHERE date BETWEEN '2010-01-10' AND '2011-01-01' 
      ORDER BY date ASC 

次のレベルアップ、私はちょうどnet_return列に追加するsupply_fee列で計算total_costs列を再利用しています[SQ1]としてこれを参照します。これは、毎行に必要な基本的なデータは、それが値を集計を開始する時間です。このレベルでは[SQL2]

 SELECT 
      financeData.*, 
      financeData.supply_fee - financeData.total_costs AS net_return 
     FROM 
     ([SQ1]) AS financeData 

としてこれを参照してくださいので、0の値で必要な変数を初期化する必要があります結論します([SQL3]

 SELECT 
      @supplyFee := 0 
      @demandFee := 0 
      @charedFee := 0 

次のレベルアップ、Iは、合計([SQL4]

を算出する算出列を使用してい

今最終的に最上位レベルで、ちょうど算出列ずに出力するように、所望の列を必要とするが([SQL5]

SELECT 
    financesTallied.date, 
    financesTallied.rate, 
    financesTallied.supply_fee, 
    financesTallied.demand_fee, 
    financesTallied.charged_fee, 
    financesTallied.total_costs, 
    financesTallied.net_return 

FROM ([SQL4]) AS financesTallied 

そして出力し、合計行

([SQL5]) UNION (
    SELECT 
     '*Total*', 
     NULL, 
     @supplyFee, 
     @demandFee, 
     @chargedFee, 
     NULL, 
     NULL 
) 
とUNION句
+0

問題はありませんが、私は面白いものを楽しんでいます。私の答えを少しきれいにしました - これらのコメントをちょっときれいにするアイデアかもしれません(これはまもなく削除されます) –

0

は、それをラップし、これに似た別の列を追加します。

select date, rate, supply_fee, demand_fee, charged_fee, totalcosts, net_returns, 
(totalcosts+net_returns+supply_fee) as grandtotal 
from(
    select date, rate, supply_fee, demand_fee, charged_fee, 
      (charged + others/rate) + demandfee as totalcosts, 
      supplyfee-((charged + others/rate) + demandfee as net_returns 
    from finances 
    where date between '2010-01-10' AND '2011-01-01') 
0

あなたが列をsummurizeするGROUP BY句でWITH ROLLUPを使用することができ、のようなものを:

select IFNULL(date, "Total") date, IFNULL(rate, "") rate, 
     supply_fee, demand_fee, charged_fee, 
     (charged + others/rate) + demandfee as totalcosts, 
     supplyfee-((charged + others/rate) + demandfee as net returns 
from financies 
Group by date, rate WITH ROLLUP 
Having date between '2010-01-10' AND '2011-01-01' 
+0

上記のクエリは正常に実行されますが、ゼロの結果セットが返されます。 – smilezjim

+0

@smilezjim、あなたのデータをチェックする、 'Having' clasueの基準に一致するデータはありますか? –

関連する問題