2012-05-07 14 views
5

मेरे पास एक डेटासेट है जिसे मैं समूह कर सकता हूं और प्रत्येक समूह में पंक्तियों का प्रतिशत जानना चाहता हूं।COUNT के साथ गणना()

यह कैसे मैं सही ढंग से इस डाली है लगभग, काम करता है के लिए छोड़कर वापस करती है कि 0 imho लापता समान किरदार

SELECT COUNT(*)/(SELECT COUNT(name) 
        FROM x 
        WHERE d = '0') 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 

की वजह से हर समूह के लिए लगता है?

उत्तर

3

बल्कि 1.0 से गुणा करने से, आप बस डाली सकता है। यह मेरे लिए साफ और स्पष्ट लगता है। एक बात के लिए, यह स्पष्ट करता है कि आप किस डेटा प्रकार का उपयोग करना चाहते हैं। सटीक numeric गणनाओं के लिए अतिरिक्त लागत का भुगतान करने के बजाय, आप float4 या float8 अनुमानों की सटीकता के साथ पर्याप्त खुश रह सकते हैं।

SELECT COUNT(*)::float/(SELECT COUNT(name) 
          FROM x 
          WHERE d = '0')::float 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 
 
test=# select 1.0 * 5/10; 
     ?column?   
------------------------ 
0.50000000000000000000 
(1 row) 

test=# select pg_typeof(1.0 * 5/10); 
pg_typeof 
----------- 
numeric 
(1 row) 

test=# select 5::float/10::float; 
?column? 
---------- 
     0.5 
(1 row) 

test=# select pg_typeof(5::float/10::float); 
    pg_typeof  
------------------ 
double precision 
(1 row) 
3

आप float के लिए अपनी समस्या को हल किया जा सकता है परिवर्तित तो

select 1.0 * count(*)/..... 
+0

वाह ... मुझे पसंद है यह एक :) कभी कभी सरल समाधान एक टलना ... –

1

करने के लिए सक्षम होना चाहिए:

SELECT convert(double, COUNT(*))/(SELECT convert(double, COUNT(name)) 
        FROM x 
        WHERE d = '0') 
    FROM x, y 
    WHERE x.a = y.a AND x.b = '0' 
    GROUP BY y.c 
    ORDER BY y.c ASC 
+0

त्रुटि: स्तंभ "फ्लोट" मौजूद नहीं है पंक्ति 1: का चयन करें परिवर्तित (नाव, COUNT (*))/(चयन बदलें (फ्लोट, सीओयू ... –

+0

इसे डबल के साथ आज़माएं। –

संबंधित मुद्दे