Попытка объединить две таблицы с помощью подзапроса - PullRequest
0 голосов
/ 19 марта 2020

Текущий запрос ниже

    select
      x.OVERALL_ID,
      extract(year from y.tsdate) as year,
      extract(month from y.tsdate) as month,
      round(sum(y.grossamount),2) as "labour cost",
      sum(y.reg)+sum(y.ot) as "labour hours"
    from
    (
    select OVERALL_ID,
          BOAT_NAME
    from TV_VESSEL_VISIT
      group by OVERALL_ID,VESSEL_NAME
      order by OVERALL_ID, VESSEL_NAME
    ) as x
    inner join
    (
    select *
    from TRANS
    where ratedesc = 'Labour'
      and opsdesc = 'Ops'
      and ACTDESC = 'Nature of Job'
      and terminal = 'UKN'
      and reconciled = 'Y'
      and TSDATE between '20-JAN-01' and '20-JAN-31'
    ) as y on x.BOAT_NAME = y.BOATNAME

      group by OVERALL_ID, extract(year from tsdate), extract(month from tsdate)
      order by OVERALL_ID, extract(year from tsdate), extract(month from tsdate);

Желаемым результатом является стоимость труда / часы OVERALL_ID, сгруппированные по году и месяцу

В настоящее время появляется ошибка ниже

ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:
Error at Line: 14 Column: 3

Попытка перейдите по этой ссылке https://www.geeksengine.com/database/subquery/subquery-in-join-operation.php

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Orable допускает AS при объявлении псевдонима столбца, но не разрешает его для псевдонима таблицы. Псевдоним подзапроса совпадает с псевдонимом таблицы. попробуйте ) x вместо ) as x, и то же самое для y. Это одна из синтаксических ошибок, которая вызывает ORA-00933.

1 голос
/ 19 марта 2020

Если используются подзапросы, НЕ используйте ORDER BY внутри этих подзапросов. Нет ничего хорошего в заказе, просто он не требуется.

Попробуйте:

SELECT
       x.OVERALL_ID
     , extract(year FROM y.tsdate) AS year
     , extract(month FROM y.tsdate) AS month
     , round(sum(y.grossamount), 2) AS "labour cost"
     , sum(y.reg) + sum(y.ot) AS "labour hours"
FROM (
         SELECT DISTINCT
            OVERALL_ID
          , BOAT_NAME
         FROM TV_VESSEL_VISIT
     ) x
INNER JOIN (
         SELECT *
         FROM TRANS
         WHERE ratedesc = 'Labour'
          AND opsdesc = 'Ops'
          AND ACTDESC = 'Nature of Job'
          AND terminal = 'UKN'
          AND reconciled = 'Y'
          AND TSDATE >= to_date('2020-01-01','yyy-mm-dd') AND TSDATE < to_date('2020-02-01','yyyy-mm-dd')
     ) y ON x.BOAT_NAME = y.BOATNAME
GROUP BY
       OVERALL_ID
     , extract(year FROM tsdate)
     , extract(month FROM tsdate)
ORDER BY
       OVERALL_ID
     , extract(year FROM tsdate)
     , extract(month FROM tsdate)
;

Примечания: я удалил ненужный ORDER BY в верхнем подзапросе и изменил это использовать SELECT DISTINCT (он даст тот же результат, что и предыдущая группа по подзапросу). Также я изменил синтаксис, используемый для диапазона дат. Пожалуйста, не используйте 2 di git ссылки на год, всегда используйте полный год. Кроме того, я всегда рекомендую избегать использования between для диапазонов дат, гораздо более предсказуемо использовать комбинацию >= с <, как вы видели выше. Кроме того, я использовал to_date(), поэтому стало ясно, какие даты я использую для диапазона дат - что даст вам каждую строку данных, относящихся к январю 2020 года.

Предыдущий синтаксис between может пропустить данные за весь день

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