MySql自定义列的总和

时间:2012-12-10 22:20:53

标签: mysql

我有一个查询,我在其中创建自定义列名称。 在相同表的末尾,我想要一行来汇总这些自定义列的所有条目。 例如,我有:

SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
    IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference 
FROM...

我想要一个包含BudgetAmount和DIfference列之和的列。 我该怎么做?

4 个答案:

答案 0 :(得分:1)

一种简单的方法是将原始查询用作内联视图,并使用内联视图作为行源编写SELECT语句。 (在MySQL的说法中,内联视图称为派生表):

SELECT v.BudgetAmount
     , v.Difference
     , v.BudgetAmount + v.Difference AS Total
  FROM (
         -- original query here
         SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
                IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference 
           FROM...
       ) v

与其他关系数据库系统不同,MySQL实际上会强制实现内联视图(即执行内联视图中的查询并将结果存储为MyISAM表),这会影响性能。

但是这是一种可以引用列别名以便在其他表达式中使用的方法。

(分配给列的别名不能在分配它们的SELECT列表中引用......它们只能在查询的HAVING和ORDER BY子句中引用。)

要在单个查询中将这些列的值添加到另一列中,您无法引用别名,您必须重复这些表达式,如下所示:

SELECT expr1          AS BudgetAmount
     , expr2          AS Difference
     , expr1 + expr2  AS Total 
  FROM ...

要引用别名,它们需要来自查询引用的行源,例如内联视图:

SELECT v.BudgetAmount
     , v.Difference
     , v.foo
     , v.BudgetAmount + v.Difference AS Total
  FROM (  SELECT expr1 AS BudgetAmount
               , expr2 AS Difference
               , foo
            FROM ...
       ) v

我不确定这是你想听的答案,但就是这样。


修改

我误解了你的要求。你的问题说:“我想要一个总和为......的列。”我认为这意味着你想要一个返回相同行数的查询,而不是你想要在结果集中追加一个额外的ROW。

答案 1 :(得分:1)

这听起来像是应用程序端总结的一个很好的候选者。但是,如果你真的只想在MySQL中这样做,我认为基本上有三种选择。

  1. 编写存储过程。
  2. 在其他人建议的UNION中执行此操作,这需要在一个语句中将基本相同的子查询两次。
  3. 试试GROUP BY ... WITH ROLLUP syntax。我假设您在SELECT中包含一个唯一的密钥,例如someUniqueID。您需要对该ID进行分组(因此每个组中只有一行)然后使用rollup子句附加其他行。汇总行中的ID列为NULL
  4. 该语句将如下所示,具体取决于您的完整查询和表结构:

    SELECT someUniqueID, ... , IFNULL(SUM(bl.amount), '---') AS BudgetAmount, 
        IFNULL( SUM( (bl.amount *1) - ( + bal1.amount ) ), '---') AS Difference 
    FROM ...
    GROUP BY someUniqueID
    WITH ROLLUP
    

答案 2 :(得分:0)

听起来你应该在应用程序端执行此操作。但是你可以在末尾使用UNION ALL来堆叠“所有条目的总和”。只需确保您的列已对齐。

SELECT amount, balance
FROM table
UNION ALL
SELECT IFNULL(SUM(amount), '---') AS BudgetAmount, 
    IFNULL(SUM(...)) AS Difference
FROM table

答案 3 :(得分:0)

我认为你可以使用它:

SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
    IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference,
    IFNULL(bl.amount, 0) + IFNULL((bl.amount *1) - ( + bal1.amount ), 0) AS NewCol
FROM...

或者你可以解释更多