我有一个带有以下表格的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
答案 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