Не группа по выражению в моем oracle SQL запросе - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующий sql запрос, который я не могу обработать с сегодняшнего дня.

Я видел много тем об этой проблеме, но я не понял его правильно, я считаю, что я пропустить понимание этого топи c, который стыдит мой день.

SELECT
    cor.c_order_id, cor.totallines,cor.documentno,cbp.name
FROM
    c_orderline   col
    LEFT JOIN c_order       cor ON cor.c_order_id = col.c_order_id
    LEFT join c_bpartner    cbp on cbp.c_bpartner_id = cor.c_bpartner_id
WHERE
    cor.issotrx = 'Y'
    and cor.docstatus not in ('DR','IP')
    AND cor.salesrep_id = 1037317
    and col.qtyordered <> 0
    and cor.dateordered between SYSDATE - 30  and SYSDATE + 30
    AND col.c_orderline_id NOT IN (
        SELECT
            cil.c_orderline_id
        FROM
            c_invoiceline cil
        WHERE
            cil.c_orderline_id IS NOT NULL
    )
    group by cor.c_order_id, cor.documentno
    order by cor.c_order_id, cor.documentno

Что я делаю неправильно ??

Ответы [ 3 ]

3 голосов
/ 22 января 2020

Упрощенный пример, основанный на таблице EMP Скотта.

Это то, что вы сделали:

SQL> select deptno, job
  2  from emp
  3  group by deptno;
select deptno, job
               *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

Как видите, Oracle пометил виновника - JOB column.

Поэтому, если вы хотите использовать предложение GROUP BY (это правильно, но - вы получите тот же результат, используя DISTINCT; эти два не следует использовать вместе. GROUP BY обычно используется с агрегатами, такими как min, max, avg и т. д.), а затем помещает все столбцы в GROUP BY:

SQL> select deptno, job
  2  from emp
  3  group by deptno, job;

    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        20 MANAGER
        30 CLERK
        10 PRESIDENT
        30 MANAGER
        10 CLERK
        10 MANAGER
        20 ANALYST

9 rows selected.

Или, как я уже сказал, используя DISTINCT:

SQL> select distinct deptno, job
  2  from emp;

    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        20 MANAGER
        30 CLERK
        10 PRESIDENT
        30 MANAGER
        10 CLERK
        10 MANAGER
        20 ANALYST

9 rows selected.

SQL>
2 голосов
/ 22 января 2020

Чтобы исправить ошибку, создаваемую этим запросом, вам нужно

group by cor.c_order_id, cor.totallines,cor.documentno,cbp.name

Группировать по всем столбцам, которые находятся в операторе select и не являются частью агрегатной функции. В чем еще проблема? Вот ДЕМОНСТРАЦИЯ

В этой демонстрации вы увидите, что запрос работает (с предложенным мною исправлением), но, как я и спросил, что еще является проблемой для вас. Уточняйте, чтобы мы могли помочь. Ура!

2 голосов
/ 22 января 2020

group by используется для агрегатных функций, таких как sum (), max (), min () et c. Какое значение вы рассчитываете в группах?

удалить группу, и ваш запрос выглядит хорошо, кроме этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...