【问题标题】:Sum all Flags in one row in Oracle在 Oracle 的一行中汇总所有标志
【发布时间】:2017-12-14 22:32:03
【问题描述】:

我必须在我的数据集中为每个成员记录创建 5 个标志。现在最后的要求是对每个成员的所有标志求和。

例如,一个成员有 - Y,Y,,,Y,即 3 个标志设置为 Y。我需要在我最后创建的总和字段中将这些总和设为 3。

我在 Oracle 中执行此操作(SAS 中的 Proc SQL)

请帮助某人!

非常感谢..

【问题讨论】:

    标签: sql oracle sas proc


    【解决方案1】:
    1. 使用 CATX 将所有内容合并到一个字段中
    2. 使用 COUNTC 将它们全部计数。

       select countc(catx(', ', flag1, flag2, flag3, flag4, flag5), 'Y') as num_y
      

    【讨论】:

      【解决方案2】:

      一种方法使用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;
      

      【讨论】:

        【解决方案3】:

        连接 5 个标志,然后使用 regexp_count() 计算“Y”。如果这是一个问题,以下还允许大写/小写。

        select regexp_count(flag1||flag2||flag3||flag4||flag5,'[yY]')
        

        Oracle 10g 及更高版本

        【讨论】:

          【解决方案4】:

          我建议重新配置表格,为 Y,N 摄取 1,0。如果可能的话。

          如果没有,oracle 有一个 regexp_count。连接字段然后 regexp_count。

          【讨论】:

            【解决方案5】:

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-18
              • 2015-03-21
              相关资源
              最近更新 更多