2010-11-15 89 views
0

我針對數據庫運行以下查詢:MySQL的單行返回從臨時表

CREATE TEMPORARY TABLE med_error_third_party_tmp 
SELECT `med_error_category`.description AS category, `med_error_third_party_category`.error_count AS error_count 
FROM 
    `med_error_category` INNER JOIN `med_error_third_party_category` ON med_error_category.`id` = `med_error_third_party_category`.`category` 
WHERE 
    year = 2003 
GROUP BY `med_error_category`.id; 

唯一的問題是,當我創建臨時表,做一個SELECT *就可以了,然後就返回多行,但上面的查詢只返回一行。它似乎總是返回一個單獨的行,除非我指定了一個GROUP BY,但它返回的百分比應該像GROUP BY一樣。

SELECT category, 
     error_count/SUM(error_count) AS percentage 
    FROM med_error_third_party_tmp; 

這裏是服務器規格:
服務器版本:5.0.77
協議版本:10
服務器:localhost通過UNIX套接字

是否有人看到這個就導致一個問題問題?

回答

3

標準SQL要求你指定GROUP BY子句中如果有一列不裹在聚合函數(IE:MIN,MAX,COUNT,SUM,AVG等),但MySQL supports "hidden columns in the GROUP BY" - 這就是爲什麼:

SELECT category, 
     error_count/SUM(error_count) AS percentage 
    FROM med_error_third_party_tmp; 

...無誤地運行。該功能的問題在於,因爲沒有GROUP BY,所以SUM是整個表的error_count列的SUM。但其他列值完全是任意的 - 它們不能被依賴。

此:

SELECT category, 
     error_count/(SELECT SUM(error_count) 
         FROM med_error_third_party_tmp) AS percentage 
    FROM med_error_third_party_tmp; 

...會給你一個百分比在每行的基礎 - 類別值將被複制,因爲沒有分組。

此:

SELECT category, 
     SUM(error_count)/x.total AS percentage 
    FROM med_error_third_party_tmp 
    JOIN (SELECT SUM(error_count) AS total 
      FROM med_error_third_party_tmp) x 
GROUP BY category 

... ...將讓你每ERROR_COUNT值VS的ERROR_COUNT值的整個表的總和類別的總和類別的百分比。

+0

+1,用於正確指出邏輯問題 – Randy 2010-11-15 19:38:03

+0

好吧,這樣可以讓我們瞭解GROUP BY。我試圖得到臨時表中每行錯誤的百分比除以總數。正如你所說,這不能被依賴。 – Khirok 2010-11-15 21:39:47

+0

我也將按類別分組。 – Khirok 2010-11-15 21:40:11

0

另一種方式來做到這一點 - 沒有臨時表作爲單獨的項目...

select category, error_count/sum(error_count) "Percentage" 
from (SELECT mec.description category 
      , metpc.error_count 
     FROM med_error_category mec 
     , med_error_third_party_category metpc 
     WHERE mec.id = metpc.category 
     AND year = 2003 
     GROUP BY mec.id 
    ); 

我想你會發現,百分比超過類別不變。這可能不是您想要的 - 您可能也想按類別對錯誤進行分組。