我有一個查詢在其中創建自定義列名稱。 在那末尾相同表我想要一個將這些自定義列的所有條目的總和的行。 比如我有:MySql自定義列的總和
SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount,
IFNULL((bl.amount *1) - (+ bal1.amount), '---') AS Difference
FROM...
我想BudgetAmount和差異列的總和列。 我該怎麼做?
我有一個查詢在其中創建自定義列名稱。 在那末尾相同表我想要一個將這些自定義列的所有條目的總和的行。 比如我有:MySql自定義列的總和
SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount,
IFNULL((bl.amount *1) - (+ bal1.amount), '---') AS Difference
FROM...
我想BudgetAmount和差異列的總和列。 我該怎麼做?
聽起來像你應該在應用程序方面做到這一點。但是,您最後可以使用UNION ALL
來疊加「所有條目的總和」。只要確保你的列是對齊的。
SELECT amount, balance
FROM table
UNION ALL
SELECT IFNULL(SUM(amount), '---') AS BudgetAmount,
IFNULL(SUM(...)) AS Difference
FROM table
列名是自定義的。所以我不能使用BudgetAmount和Difference列名。它們不存在於表格中。 –
您必須使用子查詢來獲取派生表或顯示更多代碼。 – Kermit
我認爲你可以這樣做:
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...
或者你能解釋更多
一個簡單的方法來做到這一點是使用你原來的查詢作爲內嵌視圖,寫一個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查詢的WHERE子句。)
要獲得對於加入到在一個查詢中的另一列的列中的值,你不能引用別名,你必須重複的表情,就像這樣:
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
我不確定這是你想聽到的答案,但事實就是這樣。
編輯:
我誤解你問什麼。你的問題說:「我想要一個總和......」。我認爲這意味着你想要一個返回相同行數的查詢,而不是你想要在結果集中附加一個額外的行。
這將是一個問題,因爲查詢需要很長時間,我需要原始查詢本身。所以,如果我明白你的答案,我將不得不兩次調用這個查詢,這會給用戶造成浪費。 –
@ user1693710:不,您不必調用查詢兩次。我的答案指出瞭如何引用從單個查詢中分配給表達式的別名。外部查詢可用於返回內聯視圖(原始查詢)提供的每個列,並添加一個額外的列。 – spencer7593
你的回答非常好,但它會給我一個總和的列,我希望它被列爲最後一行。即在所有DIfference列下我想要它的總和,在所有BudgetAmount列下我想要它的總和等... –
這聽起來很適合應用程序端總結。但是,如果你真的想在MySQL中做到這一點,我認爲基本上有三種選擇。
UNION
中執行此操作,這需要在一個語句中將基本相同的子查詢放置兩次。GROUP BY ... WITH ROLLUP
syntax。我假設您有一個包含在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
你想添加另一行或另一列?或者兩者兼而有之 - 另一列然後在另外一行中加總?請澄清。 –
根據我在答案中留下的評論,OP想要的是將附加行附加到結果集上,而不是(如我提供的答案)附加列。 – spencer7593