0

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

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

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

4

4 回答 4

1

我认为你可以使用这个:

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...

或者你可以解释更多

于 2012-12-10T22:47:54.500 回答
1

这听起来像是应用程序端总结的一个很好的候选者。但是,如果您真的只想在 MySQL 中执行此操作,我认为基本上有三个选项。

  1. 写一个存储过程。
  2. 正如其他人所建议的UNION那样,这需要在一个语句中两次放置基本相同的子查询。
  3. 试试GROUP BY ... WITH ROLLUP 语法。我假设您有一个包含在 中的唯一键SELECT,例如someUniqueID. 您需要根据该 ID 进行分组(因此每个组中只有一行),然后使用汇总子句追加附加行。ID 列将NULL位于汇总行中。

该语句将如下所示,具体取决于您的完整查询和表结构:

SELECT someUniqueID, ... , IFNULL(SUM(bl.amount), '---') AS BudgetAmount, 
    IFNULL( SUM( (bl.amount *1) - ( + bal1.amount ) ), '---') AS Difference 
FROM ...
GROUP BY someUniqueID
WITH ROLLUP
于 2012-12-11T17:13:20.710 回答
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。

于 2012-12-10T23:08:57.800 回答
0

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

SELECT amount, balance
FROM table
UNION ALL
SELECT IFNULL(SUM(amount), '---') AS BudgetAmount, 
    IFNULL(SUM(...)) AS Difference
FROM table
于 2012-12-10T22:23:52.897 回答