列的总和

时间:2012-02-22 12:36:46

标签: mysql sql

如何获得所有列的总和?说我有一张如下表所示的表格。我的查询获得总成本和净收益。如何在不编写第二个查询的情况下计算“总计”总和。

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'

3 个答案:

答案 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%清楚你在那里寻找什么。将其称为 [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

然后以总计行输出UNIONED

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

答案 1 :(得分: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')

答案 2 :(得分:0)

您可以使用WITH ROLLUPGROUP BY子句来汇总列,例如:

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'