尝试将'= countifs'函数从Excel复制到SQL

时间:2019-03-27 16:53:44

标签: sql oracle case

我有一个带有以下表格的excel文件:

     A                          B                             C
Registry ID             Parent Reg ID                   Focus Account (Y/N)
100000033               100000036778                          Y
100000343               1000                                  Y
1000343223              100000036778                          N

该公式位于D列(焦点父)上:=IF(COUNTIFS(C:C,"Y",B:B,B)>=1,"Y","N")

因此,在D列上,公式为每一行返回“ Y”。

我尝试使用以下代码在SQL中复制它:

SELECT 
    REGISTRY_ID,
    PARENT_REG_ID,
    FOCUS_ACCOUNT,
    SCORE_DETAILS,
    (CASE
     WHEN FOCUS_ACCOUNT = 'Y' THEN 
                            (CASE
                                    WHEN COUNT(PARENT_REG_ID) >= 1 THEN 'Y'
                                        ELSE 'N'
                            END)
     ELSE 'N'
    END) AS Focus_Parent
FROM MA_ACCOUNTS

但是此查询返回以下错误:

  

ORA-00937:不是单组分组功能

可以请教吗?

以后的修改:

让我澄清一下:我有一个列表,其中包含包含Parent_Registry_ID的唯一Registry_ID。一个Parent_Registry_ID可以具有多个Registry_ID,但是如果一个Registry_ID在Focus_Account列中标记为“ Y”,则该Parent_Registry_ID在Focus_Parent列中应该具有“ Y”。

 Registry ID    Parent Reg ID   Focus Account (Y/N)
1                     A                 N
2                     B                 N
3                     A                 Y
4                     C                 Y
5                     A                 N
6                     B                 Y
7                     A                 N
8                     D                 Y
9                     E                 N
10                    E                 N

预期结果:

   Registry ID      Parent Reg ID   Focus Account (Y/N)     Focus Parent (Y/N)
        1                 A                N                      Y
        2                 B                N                      Y
        3                 A                Y                      Y
        4                 C                Y                      Y
        5                 A                N                      Y
        6                 B                Y                      Y
        7                 A                N                      Y
        8                 D                Y                      Y
        9                 E                N                      N
       10                 E                N                      N

2 个答案:

答案 0 :(得分:3)

您使用的是聚合的count(),因此Oracle期望使用GROUP BY子句。但是,这不适合结果集的形状。似乎解析函数会更好?

您发布了一个澄清说明,我认为它定义了此规则:

  

如果任何registry_id具有focus_account='Y',则为其focus_parent = 'Y'的所有实例设置parent_reg_id

如果我的解释正确,则可以使用解析max()来简单地实现它:

select 
    registry_id,
    parent_reg_id,
    focus_account,
    max( focus_account ) over (partition by parent_reg_id) as focus_parent
from ma_accounts

这是有效的,因为focus_account是一个Y / N标志。当然,以上查询会从发布的输入数据中产生您修改后的结果集。

答案 1 :(得分:0)

您在选择部分使用了汇总方法,但没有在其他选择的变量末尾进行分组。

尝试:

SELECT 
    REGISTRY_ID,
    PARENT_REG_ID,
    FOCUS_ACCOUNT,
    SCORE_DETAILS,
    CASE WHEN COUNT(PARENT_REG_ID) >= 1 AND FOCUS_ACCOUNT = 'Y' THEN 'Y'
         ELSE 'N' END AS Focus_Parent
FROM MA_ACCOUNTS
GROUP BY REGISTRY_ID,
    PARENT_REG_ID,
    FOCUS_ACCOUNT,
    SCORE_DETAILS