ORA-01789: в блоке запросов указано неверное количество столбцов результатов - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть это (верхний запрос), который отлично работает, но я пытаюсь добавить второй запрос для работы с ним, который все, что он делает, это вычисляет сумму в день.Я все еще относительно новичок в написании SQL, и мне было интересно, если кто-то может помочь с этим?Я пытался использовать UNION, но получал в блоке запросов неверное количество столбцов результатов

Заранее спасибо!

Select POSTING_DATE, MISTI_ID, MATERIAL, CASE WHEN MTL_DESC IS NULL THEN SHORT_TEXT ELSE MTL_DESC END AS MTL_DESC, VEND_NAME1, RECIPIENT, QTY, AMT_GRP_CURR From COST_DM5_DAILY Where COST_CENTER = 'C1003' ORDER BY POSTING_DATE DESC

Этовторой запрос

Select SUM(AMT_GRP_CURR), Posting_date From COST_DM5_DAILY Where COST_CENTER = 'C1003' group by Posting_date order by Posting_date desc

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Ваш первый запрос имеет 8 столбцов в наборе результатов, а второй - только 2;который объясняет сообщение об ошибке.Первый также имеет первый столбец даты, что является вторичной проблемой - типы данных столбцов должны совпадать в каждой позиции (или быть неявно конвертируемыми, по крайней мере).

Вам необходимо поменять местами порядокстолбцы во втором запросе (таким образом, дата идет первой), а затем решите, в какой позиции вы хотите получить сумму - и добавьте нулевые значения для остатка (возможно; или другого фиксированного значения).

Select POSTING_DATE,
       MISTI_ID,
       MATERIAL,
       CASE
         WHEN MTL_DESC IS NULL THEN
          SHORT_TEXT
         ELSE
         MTL_DESC
         END AS MTL_DESC,
       VEND_NAME1,
       RECIPIENT,
       QTY,
       AMT_GRP_CURR
  From COST_DM5_DAILY
  Where COST_CENTER = 'C1003'
union all
Select Posting_date,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL,
       SUM(AMT_GRP_CURR)
  From COST_DM5_DAILY
  Where COST_CENTER = 'C1003'
  group by Posting_date
  order by Posting_date desc;

Вымогут потребоваться дополнительные термины в order by, поскольку у вас будет кратное число для одной и той же даты.

Это, вероятно, то, что должен делать ваш уровень приложений / отчетности.

0 голосов
/ 05 декабря 2018

Ошибка говорит о том, что число и тип данных столбцов, используемых в UNION, должны совпадать.Посмотрите на этот простой пример:

Отсутствует col2 во 2-м select:

SQL> select 100 col1, 'a' col2 from dual
  2  union
  3  select 300 col1           from dual;
select 100 col1, 'a' col2 from dual
*
ERROR at line 1:
ORA-01789: query block has incorrect number of result columns    

Неверный col2 тип данных во 2-м select:

SQL> select 100 col1, 'a' col2 from dual
  2  union
  3  select 300 col1, sysdate  from dual;
select 100 col1, 'a' col2 from dual
                 *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

Наконец, путь:

SQL> select 100 col1, 'a' col2 from dual
  2  union
  3  select 300 col1, 'b' col2 from dual;

      COL1 C
---------- -
       100 a
       300 b

SQL>

Что касается вашего кода, кажется, что вы не можете этого сделать - по крайней мере, это не будет иметь смысла, как выGROUP BY все столбцы , используемые в списке столбцов SELECT, которые не агрегированы:

select posting_date,
       misti_id,
       material,
       case
         when mtl_desc is null then short_text
         else mtl_desc
       end as mtl_desc,
      vend_name1,
      recipient,
      qty,
      amt_grp_curr,
      --
      sum(amg_grp_curr) sum_result
from cost_dm5_daily
where cost_center = 'C1003'
group by 
       posting_date,
       misti_id,
       material,
       case
         when mtl_desc is null then short_text
         else mtl_desc
       end as mtl_desc,
      vend_name1,
      recipient,
      qty,
      amt_grp_curr
order by posting_date desc;

Возможно, аналитическая форма функции SUM можетПомогите.Например:

select posting_date,
       misti_id,
       material,
       case
         when mtl_desc is null then short_text
         else mtl_desc
       end as mtl_desc,
      vend_name1,
      recipient,
      qty,
      amt_grp_curr,
      --
      sum(amg_grp_curr) over(partition by posting_date order by null) sum_result
from cost_dm5_daily
where cost_center = 'C1003'
order by posting_date desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...