表1有2列如下
collect
表1中的数据
a with datatype Number
b with datatype clob
在表1的第一行中,'Rock'的值为Y,'Paper'的值为No,'Scissor'的值为Yes,'Dragon'的值为b列中的Y. br />我想只考虑Rock,Paper和Scissor,在b列中分别为Y,Yes和Yes计数。
我希望根据列c的值对列a进行计数。
实施例:
对于a = 100,仅计算具有值的属性(Rock = Y,Paper = Yes,Scissor + Yes),即2,因为Rock的值为Y且Scissor的值为Yes。
同样地,对于a = 101,count = 1,因为只有剪刀具有期望值,即'是',而Rock具有'N'而Paper具有'否'。
对于a = 102,count = 2 Rock and Paper分别具有所需的值,即Y和Yes。
如何实现这一结果?
答案 0 :(得分:0)
如果将数据分成单独的“属性”,则可以使用简单的SQL完成答案。这里使用SUBSTR函数,但也应该使用等效的CLOB函数。
标签包含示例数据 tab_attributes将样本数据分离为属性 tab_nbr将Y转换为1,将N转换为0 最终选择只是添加它们:
with tab as
(select 100 a, 'Rock+Y;Paper+No;Scissor+Yes;Dragon+Y;' b from dual union
select 101 a, 'Rock+N;Paper+No;Scissor+Yes;Dragon+N;' b from dual union
select 102 a, 'Rock+Y;Paper+Yes;Scissor+N;Dragon+Y;' b from dual
)
, tab_attributes as
(
select a
, substr(b, instr(b, 'Rock+')+5,1) rock
, substr(b, instr(b, 'Paper+')+6,1) paper
, substr(b, instr(b, 'Scissor+')+8,1) scissor
from tab
)
, tab_nbr as
(select a
, case when rock = 'Y' then 1 when rock = 'N' then 0 else null end as rock
, case when paper = 'Y' then 1 when paper = 'N' then 0 else null end as paper
, case when scissor = 'Y' then 1 when scissor = 'N' then 0 else null end as scissor
from tab_attributes
)
select a, rock+paper+scissor cnt from tab_nbr
;