Rambo_Raja Ответов: 1

Как передать все между датами из диапазона дат в операторе " in " для oracle pivot?


Что я хочу, так это передать полный диапазон дат в предложении Pivot "IN". Но то, что я делаю, - это использование только тех значений, которые я получаю из базы данных.

Например.

Предположим, если пользователь выберет начальную дату как "10/10/2015" и до даты как "10/15/2015", то я хочу использовать все значения (10/10/2015,10/11/2015,10/12/2015,10/13/2015,10/14/2015,10/15/2015)

Но то, что происходит из моего запроса, таково ('10/10/2015','10/15'2015')

Теперь данные поступают вот так:
M_NAME PHONE JOB_ID Assigned_DATE SHIFT Assignment E_ID EMP_NAME DEPT_COLOR '10/10/2015' '10/15/2015'

Но я хочу вот так:
M_NAME PHONE JOB_ID Assigned_DATE SHIFT Assignment E_ID EMP_NAME DEPT_COLOR '10/10/2015' '10/11/2015' '10/12/2015' '10/13/2015' '10/14/2015' '10/15/2015'


Что я уже пробовал:

SELECT * FROM 
             (
 SELECT 
  Employee.M_NAME AS MANAGER_NAME,
  Employee.PHONE,
  Employee.JOB_ID,
  Employee.Assigned_DATE,
  Employee.SHIFT,
  Employee.Dept as Assignment, 
  Employee.E_ID, 
  Employee.NAME AS EMP_NAME,
  Employee.DEPT_COLOR
  FROM  Employee
  WHERE Assigned_Date BETWEEN
  TO_DATE('FD_Selected','MM/DD/YYYY') AND
  TO_DATE('TD_Selected','MM/DD/YYYY')
  ORDER by Employee.E_ID
             ) x
             PIVOT 
             (
                 min(Assignment)
                 FOR Assigned_Date IN (TO_DATE('FD_Selected','YYYY-MM-DD'),
                                      TO_DATE('TD_Selected','YYYY-MM-DD')
              )
          ) p 

1 Ответов

Рейтинг:
0

Wendelius

Насколько я знаю, вы не можете определить предложение PIVOT для использования динамического количества столбцов. Вам нужно явно определить каждый возвращаемый столбец. Таким образом, в вашем примере SQL должен выглядеть следующим образом

SELECT * FROM (
 SELECT 
  Employee.M_NAME AS MANAGER_NAME,
  Employee.PHONE,
  Employee.JOB_ID,
  Employee.Assigned_DATE,
  Employee.SHIFT,
  Employee.Dept as Assignment, 
  Employee.E_ID, 
  Employee.NAME AS EMP_NAME,
  Employee.DEPT_COLOR
  FROM  Employee
  WHERE Assigned_Date BETWEEN TO_DATE('FD_Selected','MM/DD/YYYY') 
                      AND TO_DATE('TD_Selected','MM/DD/YYYY')
  ORDER by Employee.E_ID
  ) x
  PIVOT (
     min(Assignment)
     FOR Assigned_Date IN (TO_DATE('10/10/2015', 'YYYY-MM-DD'),
                           TO_DATE('10/11/2015', 'YYYY-MM-DD'),
                           TO_DATE('10/12/2015', 'YYYY-MM-DD'),
                           TO_DATE('10/13/2015', 'YYYY-MM-DD'),
                           TO_DATE('10/14/2015', 'YYYY-MM-DD'),
                           TO_DATE('10/15/2015', 'YYYY-MM-DD'))
  )
) p 

Другими словами, вам нужно построить динамическую часть при построении самого оператора SQL.


Rambo_Raja

Спасибо, Мика. Я пытаюсь сделать это с помощью этого запроса, который возвращает мне все даты, которые попадают в выбранный диапазон дат.

выберите TO_DATE('11/10/2016', 'MM/DD/YYYY') + rownum -1
из all_objects
где rownum <= TO_DATE('12/31/2016', 'MM/DD/YYYY') - TO_DATE ('11/10/2016', 'MM/DD/YYYY')+1 ;

Wendelius

Запрос возвращает полный диапазон дат, но если вы хотите, чтобы каждая из дат отображалась в отдельном столбце при повороте, то вам необходимо иметь определение столбца в предложении PIVOT для всех дат.

Другими словами, если вы хотите 2 даты, вы определяете 2 столбца в PIVOT для IN. Если вы хотите 5 дней, вам нужно 5 определений столбцов. Таким образом, определения столбцов не являются динамическими.

Rambo_Raja

Но дело в том, что я не могу использовать выходные данные этого запроса. Не могли бы вы помочь мне с этим? С уважением.