我有一个包含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查询,该表包含数百万条记录
答案 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'(真/假),我建议您使用0
和1
值作为NUMERIC(1)
。然后你只需添加列而不进行任何解码。