【发布时间】:2017-12-14 22:32:03
【问题描述】:
我必须在我的数据集中为每个成员记录创建 5 个标志。现在最后的要求是对每个成员的所有标志求和。
例如,一个成员有 - Y,Y,,,Y,即 3 个标志设置为 Y。我需要在我最后创建的总和字段中将这些总和设为 3。
我在 Oracle 中执行此操作(SAS 中的 Proc SQL)
请帮助某人!
非常感谢..
【问题讨论】:
我必须在我的数据集中为每个成员记录创建 5 个标志。现在最后的要求是对每个成员的所有标志求和。
例如,一个成员有 - Y,Y,,,Y,即 3 个标志设置为 Y。我需要在我最后创建的总和字段中将这些总和设为 3。
我在 Oracle 中执行此操作(SAS 中的 Proc SQL)
请帮助某人!
非常感谢..
【问题讨论】:
使用 COUNTC 将它们全部计数。
select countc(catx(', ', flag1, flag2, flag3, flag4, flag5), 'Y') as num_y
【讨论】:
一种方法使用case:
select t.*,
((case when flag1 = 'Y' then 1 else 0 end) +
(case when flag2 = 'Y' then 1 else 0 end) +
(case when flag3 = 'Y' then 1 else 0 end) +
(case when flag4 = 'Y' then 1 else 0 end) +
(case when flag5 = 'Y' then 1 else 0 end)
) as num_ys
from t;
【讨论】:
连接 5 个标志,然后使用 regexp_count() 计算“Y”。如果这是一个问题,以下还允许大写/小写。
select regexp_count(flag1||flag2||flag3||flag4||flag5,'[yY]')
Oracle 10g 及更高版本
【讨论】:
我建议重新配置表格,为 Y,N 摄取 1,0。如果可能的话。
如果没有,oracle 有一个 regexp_count。连接字段然后 regexp_count。
【讨论】:
user9026530特地说他用的是SAS,这里是一个纯SQL的方案,不涉及SAS函数:
WITH
aset
AS
(SELECT 'Y' flag1
, 'N' flag2
, 'Y' flag3
, 'Y' flag4
, NULL flag5
FROM DUAL)
SELECT aset.*, LENGTH (REGEXP_REPLACE (flag1 || flag2 || flag3 || flag4 || flag5, '[^Y]', NULL)) flag_count
FROM aset
FLAG1 FLAG2 FLAG3 FLAG4 FLAG5 FLAG_COUNT
Y N Y Y 3
【讨论】: