2012-02-22 46 views
1

我如何獲得所有列的總和?假設我有一張如下所示的桌子。我的查詢獲得總成本和淨收益。我怎樣才能在不寫第二個查詢的情況下計算「總數」總和。列的總和

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''看起來不正確,而你打開兩個括號,而只關閉一個...... – 2012-02-22 12:40:46

+0

Redited the post did see the one – smilezjim 2012-02-22 12:43:54

+0

你的配方需要澄清,它們並沒有真正意義上的逐字 – 2012-02-22 13:07:52

回答

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%清楚你在那裏尋找什麼。將把這個作爲[SQ1]

  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 

下一級別我只是重用計算total_costs柱與supply_fee列在net_return列添加。到此結束,你每行所需要的基礎數據,將其稱爲[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 

下一級別,我使用的計算出的行來計算總計([SQL4]

SELECT 
     financeWithNetReturn.*, 
     @supplyFee := @supplyFee + financeWithNetReturn.supply_fee, 
     @demandFee := @demandFee + financeWithNetReturn.demand_fee, 
     @charedFee := @charedFee + financeWithNetReturn.charged_fee 
    FROM 
    ([SQL2]) AS financeWithNetReturn, 
    ([SQL3]) AS variableInit 

現在終於在頂層,只需要輸出,而不計算列所需的列([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 
) 
+0

沒問題,我很享受有趣的。清理了我的答案 - 可能是一個想法,清理這些評論(稍後將刪除這一點) – 2012-02-23 10:31:31

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

可以使用WITH ROLLUPGROUP BY子句summurize你的欄目,像:

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 2012-02-23 07:32:10

+0

@smilezjim,檢查你的數據,是否有任何數據符合'Having'中的條件? – 2012-02-23 07:35:45