Попытка реплицировать функцию '= countifs' из Excel в SQL - PullRequest
1 голос
/ 27 марта 2019

У меня есть файл 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: не групповая функция для одной группы

Не могли бы вы посоветовать?

Позднее редактировать:

Позвольте мне уточнить это: у меня есть список с уникальными идентификаторами Registry_ID, которые содержат идентификатор Parent_Registry_ID. Parent_Registry_ID может иметь несколько Registry_ID, но если Registry_ID помечен как «Y» в столбце Focus_Account, то у Parent_Registry_ID должно быть «Y» в столбце Focus_Parent.

 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 ]

3 голосов
/ 27 марта 2019

Вы используете агрегированное 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. Конечно, приведенный выше запрос создает ваш пересмотренный набор результатов на основе опубликованных входных данных.

0 голосов
/ 27 марта 2019

Вы используете метод агрегирования в разделе выбора, но не группируете в конце другие выбранные переменные.

Попытка:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...