2016-02-22 72 views
1

我有此查詢顯示有關主題中出現的情況下的頻率和BPostgreSQL的 - 從查詢列百分比

select subject, 
count(subject) as frequency, 
count(case when result='OK' then 1 else null end) as case_a, 
count(case when result='NG' then 1 else null end) as case_b, 
round(
(
(count(case when result='OK' then 1 else null end)*100.00)/count(subject)),4) 
) 
from test 
group by subject 

我猜測,如果有一個更好的情況下,A的外觀的百分比的信息更高級的方式來計算百分比,而不必再次應用計數情況。

round(((case_a*100.00)/frequency),4) 

試圖引用這樣的列^但不起作用。

回答

0

正如你所說,你不能引用這樣的列別名。它周圍的一種方法是把所有的計算中的一個子查詢:

SELECT subject, frequency, case_a, case_b, ROUND(case_a * 100.0/frequency, 4) 
FROM (SELECT subject, 
        COUNT(subject) AS frequency, 
        COUNT(CASE WHEN result = 'OK' THEN 1 ELSE NULL END) AS case_a, 
        COUNT(CASE WHEN result = 'NG' THEN 1 ELSE NULL END) AS case_b 
     FROM  test 
     GROUP BY subject) t 

編輯:
作爲一個側面說明,如果沒有在一個case表達的條件得到滿足,則返回null,所以你可以略微縮短表情。然後效果最終是相同的,所以它主要是一個品味的問題:

SELECT subject, frequency, case_a, case_b, ROUND(case_a * 100.0/frequency, 4) 
FROM (SELECT subject, 
        COUNT(subject) AS frequency, 
        COUNT(CASE result WHEN 'OK' THEN 1 END) AS case_a, 
        COUNT(CASE result WHEN 'NG' THEN 1 END) AS case_b 
     FROM  test 
     GROUP BY subject) t 
+1

這個子查詢方法當然有趣,謝謝。 –