Есть ли способ использовать переменную COUNT в условии, когда прямой счет невозможен в длинном многостоловом запросе - PullRequest
1 голос
/ 04 ноября 2019

Я получаю эту логическую ошибку, мне нужно получить строки, в которых количество данных больше 0. Я пробовал

'HAVING c> 0'

но возвращается как ошибка

'ORA-00904: "C": неверный идентификатор "

Ниже приведен запрос, который я пытался дать мне результаты.

SELECT ACCOUNTS.ACCOUNT_NO,(Select count(*) as cc from SALE where sale.account_no=accounts.account_no and DATED >= add_months(sysdate, -6) ) as c, (select LISTAGG(v.TYPE_NAME, ',') WITHIN GROUP (ORDER BY v.TYPE_NAME) AS deals  from  DEALSIN v  where account_no=accounts.account_no ) as deals FROM ACCOUNTS,DETAIL_ACCOUNTS,CITY WHERE ACCOUNTS.ACCOUNT_NO = DETAIL_ACCOUNTS.ACCOUNT_NO AND DETAIL_ACCOUNTS.CITY = REGISTRATION_NO AND PARENT_CODE = 111 AND STATUS = 'A' AND CITY =:CITY_Name having c>0 order by c desc 

Я хочу выводить как

ACCOUNT_NO  C   DEALS
1           10  deal1,deal2
2           9   deal1,deal3
3           3   deal4

, но я получаю

ACCOUNT_NO  C   DEALS
1           10  deal1,deal2
2           9   deal1,deal3
3           3   deal4
4           0   deal  ----> DON'T WANT THIS ROW
5           0   deal0 ----> DON'T WANT THIS ROW

Я не хочу эту строку с count = 0.

1 Ответ

1 голос
/ 04 ноября 2019

Я предлагаю перефразировать ваш запрос, чтобы покончить с этими встроенными коррелированными подзапросами в предложении select. Вместо этого оставьте объединение для отдельных подзапросов в таблицах SALE и DEALSIN.

SELECT
    a.ACCOUNT_NO,
    COALESCE(s.cc, 0) AS c,
    COALESCE(v.deals, 'NA') AS deals,
FROM ACCOUNTS a
LEFT JOIN
(
    SELECT account_no, COUNT(*) AS cc
    FROM SALE
    WHERE DATED >= ADD_MONTHS(SYSDATE, -6)
    GROUP BY account_no
) s
    ON s.account_no = a.account_no
LEFT JOIN
(
    SELECT account_no,
        LISTAGG(v.TYPE_NAME, ',') WITHIN GROUP (ORDER BY v.TYPE_NAME) AS deals
    FROM DEALSIN
    GROUP BY account_no
) v
    ON v.account_no = a.account_no
INNER JOIN DETAIL_ACCOUNTS da
    ON a.ACCOUNT_NO = da.ACCOUNT_NO
INNER JOIN CITY c
    ON da.CITY = c.REGISTRATION_NO
WHERE
    PARENT_CODE = 111 AND
    STATUS = 'A' AND
    CITY =:CITY_Name AND
    COALESCE(s.cc, 0) > 0   -- your previous HAVING clause now appears in WHERE
ORDER BY
    c DESC;
...