【问题标题】:Trying to replicate a '=countifs' function from excel to SQL试图将 '=countifs' 函数从 excel 复制到 SQL
【发布时间】:2019-03-27 16:53:44
【问题描述】:

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

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

公式在 D 列(Focus Parent)上:=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,但如果 R​​egistry_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

【问题讨论】:

  • 分享你的预期输出
  • 你在SELECT中使用COUNT(PARENT_REG_ID),所以期待GROUP BY

标签: sql oracle case


【解决方案1】:

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

您已经发布了我认为定义此规则的说明:

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

如果我的解释是正确的,您可以通过 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 标志。当然,上述查询会根据发布的输入数据生成您修改后的结果集。

【讨论】:

  • 有效!我还发现这段代码也可以正常工作:SELECT M.*,NVL(x.FOCUS_ACCOUNT,'N') FROM MA_ACCOUNTS M LEFT JOIN (SELECT DISTINCT PARENT_REG_ID, FOCUS_ACCOUNT FROM MA_ACCOUNTS WHERE FOCUS_ACCOUNT = 'Y') X ON X.PARENT_REG_ID = M.PARENT_REG_ID谢谢你的回答!
  • 不客气。我们经常发现,指定一个明确的要求是获得及时和有用的解决方案的关键:D
【解决方案2】:

您在选择部分使用聚合方法,但最后没有对其他选定变量进行分组。

试试:

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

【讨论】:

  • 按投影中的所有列分组将改变focus_parent的计算。 Excel 版本只计算 PARENT_REG_ID 的出现次数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多