我有一个查询,我在其中创建自定义列名。在同一张表的末尾,我想要一个将这些自定义列的所有条目相加的行。例如我有:
SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount,
IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference
FROM...
我想要一个包含 BudgetAmount 和 Difference 列之和的列。我怎么做?
我有一个查询,我在其中创建自定义列名。在同一张表的末尾,我想要一个将这些自定义列的所有条目相加的行。例如我有:
SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount,
IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference
FROM...
我想要一个包含 BudgetAmount 和 Difference 列之和的列。我怎么做?
我认为你可以使用这个:
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...
或者你可以解释更多
这听起来像是应用程序端总结的一个很好的候选者。但是,如果您真的只想在 MySQL 中执行此操作,我认为基本上有三个选项。
UNION
那样,这需要在一个语句中两次放置基本相同的子查询。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
一种简单的方法是将原始查询用作内联视图,并使用内联视图作为行源编写 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。
听起来您应该在应用程序端执行此操作。但是您可以UNION ALL
在最后使用来堆叠“所有条目的总和”。只要确保你的列是对齐的。
SELECT amount, balance
FROM table
UNION ALL
SELECT IFNULL(SUM(amount), '---') AS BudgetAmount,
IFNULL(SUM(...)) AS Difference
FROM table