oracle中具有特定标志的列数

时间:2017-12-02 19:18:19

标签: sql oracle

我有一个包含10列的表来存储标志,对于下面的名称

,它只能是Y或N.
NAME    FLAG1   FLAG2   FLAG3   FLAG4   FLAG5   …   FLAG10
----------------------------------------------------------
name1     Y       N       Y       Y       Y          N
name2     N       N       Y       N       N          Y
name3     Y       Y       Y       N       Y          N

我想得到每个名字的Y和N的数量。

NAME   Y     N
---------------
name1  4     6
name2  2     8
name3  5     5

寻找性能良好的oracle / sql查询,该表包含数百万条记录

2 个答案:

答案 0 :(得分:4)

使用REGEXP_COUNT计算字符出现次数:

SELECT name,
   REGEXP_COUNT(Flag1||Flag2||Flag3||Flag5||Flag6||Flag7||Flag8||Flag9||Flag10,'Y')  AS Y,
   REGEXP_COUNT(Flag1||Flag2||Flag3||Flag5||Flag6||Flag7||Flag8||Flag9||Flag10,'N')  AS N
FROM t

答案 1 :(得分:2)

您可以使用DECODE

SELECT name,
   DECODE(Flag1, 'Y', 1, 'N', 0) + 
   DECODE(Flag2, 'Y', 1, 'N', 0) +  
   --...
   DECODE(Flag10, 'Y', 1, 'N', 0) AS Y,
   DECODE(Flag1, 'Y', 0, 'N', 1) + 
   DECODE(Flag2, 'Y', 0, 'N', 1) +  
   --...
   DECODE(Flag10, 'Y', 0, 'N', 1) AS N
FROM table;

<强> DBFiddle Demo

使用UNPIVOT

SELECT name, SUM(DECODE(FlagV,'Y', 1, 'N', 0)) AS Y,
       SUM(DECODE(FlagV, 'Y', 0, 'N', 1)) AS N
FROM t
UNPIVOT ( FlagV FOR Flag IN (Flag1,Flag2,Flag10)) unpvt
GROUP BY name;

<强> DBFiddle Demo 2

注意:如果您只想保留2个值'Y'/'N'(真/假),我建议您使用01值作为NUMERIC(1)。然后你只需添加列而不进行任何解码。