Ошибка «Здесь разрешены только простые имена столбцов» с динамическим магическим шарниром в APEX 5 ORACLE SQL - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь построить PIVOT-таблицу в Oracle APEX 5. У меня есть 3 таблицы:

Таблица CAB
Идентификационный номер
CAB_DATE DATE

Таблица CAB_DEP_TO_CAB
CAB_IDVARCHAR2
DEP_ID VARCHAR2

Таблица CAB_DEP
Идентификационный номер
DEP_NAME VARCHAR2

я пробовал:

SELECT DISTINCT 
    LISTAGG('''' || CAB_DATE || ''' AS ' || CAB_DATE,',')
        WITHIN GROUP (ORDER BY CAB_DATE) AS temp_in_statement 
    FROM (SELECT DISTINCT CAB_DATE FROM CAB);

это работает без проблем, но не PIVOT:

SELECT * FROM 
    (SELECT cd.dep_name, c.cab_date, d.dep_id FROM cab c INNER JOIN cab_dep_to_cab d ON c.id = d.cab_id INNER JOIN cab_dep cd ON d.dep_id like ('%' || cd.id || '%') )
    PIVOT (SUM(dep_id) FOR c.cab_date IN (&str_in_statement));

Возвращает ошибку: ORA-01748 «здесь разрешены только простые имена столбцов»

Может кто-нибудь увидеть мою ошибку?: O

кстати.Я хочу такой результат: enter image description here

кстати.я пытался использовать код здесь: Динамический поворот в оракуле sql

1 Ответ

0 голосов
/ 13 сентября 2018

Я думаю, что проблема в том, что вы используете "c.cab_date" вместо "cab_date" в функции pivot. Это должно работать (не уверен, почему у вас есть такое странное условие соединения при втором соединении, я заменил его более разумным):

SELECT * FROM 
    (SELECT cd.dep_name
          , c.cab_date
          , d.dep_id
       FROM cab c 
      INNER JOIN cab_dep_to_cab d ON c.id = d.cab_id 
      INNER JOIN cab_dep cd ON d.dep_id = cd.id
    )
 PIVOT (SUM(dep_id) FOR cab_date IN (&str_in_statement));

И если я могу добавить несколько небольших подсказок для дизайна ваших таблиц: я бы рекомендовал называть столбец как «идентификатор отдела» всегда одинаково, что на мой взгляд сделает код более читабельным, но это всего лишь личное предпочтение конечно;)

Я бы назвал вещи так:

Table CAB
CAB_ID number
CAB_DATE date

Table DEPARTMENTS
DEPARTMENT_ID number
DEPARTMENT_NAME varchar2

Table DEPARTMENT_CABS
CAB_ID number  -- not varchar as in your example!
DEPARTMENT_ID number  -- not varchar as in your example!
...