我有一个查询,我在其中创建自定义列名称。 在相同表的末尾,我想要一行来汇总这些自定义列的所有条目。 例如,我有:
SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount,
IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference
FROM...
我想要一个包含BudgetAmount和DIfference列之和的列。 我该怎么做?
答案 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中这样做,我认为基本上有三种选择。
UNION
中执行此操作,这需要在一个语句中将基本相同的子查询两次。GROUP BY ... WITH ROLLUP
syntax。我假设您在SELECT
中包含一个唯一的密钥,例如someUniqueID
。您需要对该ID进行分组(因此每个组中只有一行)然后使用rollup子句附加其他行。汇总行中的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
答案 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...
或者你可以解释更多