2017-06-16 61 views
-2

我的数据库看起来是这样的:的Oracle SQL计数山坳值

+-----+----------+-----------+----------+ 
+ ID + col1 + col2 + col 3 + 
+-----+----------+-----------+----------+ 
+ 1 + Y  + N  +  Y + 
+-----+----------+-----------+----------+ 

我想已经是Y的percantage相比于N,例如Y = 2,N = 1 - > 75%

我可以在SQL中执行此操作吗?

+2

你到目前为止试过了什么?另外,如何从Y = 2,N = 1得到75%? – Aleksej

+1

不应该是'Y = 66.666600'和'N = 33.333300' –

+0

而且,你只能在列中有Y/N吗?有可能有空值吗? – Aleksej

回答

1

我会区分这样的:

select ID, 
     floor((case when col1 = Y then 1 else 0 end + 
       case when col2 = Y then 1 else 0 end + 
       case when col3 = Y then 1 else 0 end)* 100/3) as pc_Y 
from MyTable 
0

解码可以做到这一点。但是,正如已经被问到注释中的NULL值如何,我在假设NULL可以存在并且可能具有所有值都不是'X'或'Y'的情况下提供。

SELECT ID, 
     DECODE (xy_val, 
       0, 'N/A', 
       ROUND ((y_val/x_val) * 100) 
      ) y_to_x_percent 
    FROM (SELECT ID, 
       ( DECODE (NVL (col1, 0), 'Y', 1, 0) 
       + DECODE (NVL (col2, 0), 'Y', 1, 0) 
       + DECODE (NVL (col3, 0), 'Y', 1, 0) 
       ) y_val, 
       ( DECODE (NVL (col1, 0), 'Y', 1, 'X', 1, 0) 
       + DECODE (NVL (col2, 0), 'Y', 1, 'X', 1, 0) 
       + DECODE (NVL (col3, 0), 'Y', 1, 'X', 1, 0) 
       ) xy_val 
      FROM my_table);