2012-12-10 19 views
0

我有一個查詢在其中創建自定義列名稱。 在那末尾相同表我想要一個將這些自定義列的所有條目的總和的行。 比如我有:MySql自定義列的總和

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

我想BudgetAmount和差異列的總和列。 我該怎麼做?

+0

你想添加另一行或另一列?或者兩者兼而有之 - 另一列然後在另外一行中加總?請澄清。 –

+0

根據我在答案中留下的評論,OP想要的是將附加行附加到結果集上,而不是(如我提供的答案)附加列。 – spencer7593

回答

0

聽起來像你應該在應用程序方面做到這一點。但是,您最後可以使用UNION ALL來疊加「所有條目的總和」。只要確保你的列是對齊的。

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

列名是自定義的。所以我不能使用BudgetAmount和Difference列名。它們不存在於表格中。 –

+0

您必須使用子查詢來獲取派生表或顯示更多代碼。 – Kermit

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

或者你能解釋更多

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查詢的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 

我不確定這是你想聽到的答案,但事實就是這樣。


編輯:

我誤解你問什麼。你的問題說:「我想要一個總和......」。我認爲這意味着你想要一個返回相同行數的查詢,而不是你想要在結果集中附加一個額外的行。

+0

這將是一個問題,因爲查詢需要很長時間,我需要原始查詢本身。所以,如果我明白你的答案,我將不得不兩次調用這個查詢,這會給用戶造成浪費。 –

+0

@ user1693710:不,您不必調用查詢兩次。我的答案指出瞭如何引用從單個查詢中分配給表達式的別名。外部查詢可用於返回內聯視圖(原始查詢)提供的每個列,並添加一個額外的列。 – spencer7593

+0

你的回答非常好,但它會給我一個總和的列,我希望它被列爲最後一行。即在所有DIfference列下我想要它的總和,在所有BudgetAmount列下我想要它的總和等... –

1

這聽起來很適合應用程序端總結。但是,如果你真的想在MySQL中做到這一點,我認爲基本上有三種選擇。

  1. 編寫存儲過程。
  2. 按照其他人的建議在UNION中執行此操作,這需要在一個語句中將基本相同的子查詢放置兩次。
  3. 嘗試GROUP BY ... WITH ROLLUPsyntax。我假設您有一個包含在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