如何获得所有列的总和?说我有一张如下表所示的表格。我的查询获得总成本和净收益。如何在不编写第二个查询的情况下计算“总计”总和。
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 :(得分: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 ROLLUP
和GROUP 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'