Альтернатива для ПОВОРОТА в oracle sql

#sql #oracle

#sql #Oracle

Вопрос:

Я использую oracle sql developer для получения данных выходных дней. Когда запрос выполняется в понедельник, он будет извлекать данные за предыдущие выходные.

Этот запрос работает

 SELECT * FROM 
(
    select 
        mm.r_number, 
        s.holder,
        trunc(mm.received_date) - TRUNC(SYSDATE-2) as received_date
FROM messages mm
JOIN items s ON (mm.r_number = s.service_num)
WHERE account_number = 12353
AND r_number in ('0000928158','0000927608','0000927610','0000945321')
)
PIVOT
(
COUNT(received_date)
FOR received_date in (1 as Sunday, 2 as Saturday)
)
ORDER BY r_number
 

Необработанные данные

r_number s.holder mm.received_date
0000928158 АВАРИЙНАЯ СИТУАЦИЯ LVAD (AH) 17-21 МАРТА
0000928158 АВАРИЙНАЯ СИТУАЦИЯ LVAD (AH) 16-21 МАРТА
0000927610 RX / АПТЕКА 15-21 МАРТА

Вывод

введите описание изображения здесь

Проблема: как мне получать даты вместо дней

Комментарии:

1. Не могли бы вы предоставить свой пример ввода и ожидаемый результат?

2. Вы этого не делаете; a PIVOT должен иметь фиксированные значения, чтобы вы могли выполнять поворот 2020-03-13 , поскольку это статическое значение, но вы не можете выполнить поворот на дату с прошлой субботы, поскольку она меняется от недели к неделе.

3. MTO- спасибо за ваш ответ. Как мне добиться тех же результатов в sql без поворота

4. Вы задаете несколько вопросов: заголовок гласит «Альтернатива PIVOT» ; последняя фраза гласит: «Как мне получать даты вместо дней» ; и в комментариях это снова «Как мне добиться тех же результатов в sql без поворота» . Пожалуйста, придерживайтесь только одного вопроса.

Ответ №1:

Вам нужно будет использовать динамический SQL в блоке PL / SQL. Что-то вроде:

 DECLARE
  strSaturday_column   VARCHAR2(30) := TO_CHAR(SYSDATE-2, 'DD-MON-YYYY');
  strSunday_column     VARCHAR2(30) := TO_CHAR(SYSDATE-1, 'DD-MON-YYYY');
  rc                   SYS_REFCURSOR;
  nR_number            NUMBER;
  strHolder            VARCHAR2(2000);
  nSaturday            NUMBER;
  nSunday              NUMBER;
  tab                  CHAR(1) := CHR(9);
BEGIN
  OPEN rc FOR
   'SELECT R_NUMBER, HOLDER, SATURDAY AS ' || strSaturday_column ||
   '       SUNDAY AS ' || strSunday_column ||
   '  FROM (SELECT *
              FROM (select mm.r_number, 
                           s.holder,
                           trunc(mm.received_date) - TRUNC(SYSDATE-2) as received_date
                      FROM messages mm
                      JOIN items 
                        ON (mm.r_number = s.service_num)
                      WHERE account_number = 12353 AND
                            r_number in ('0000928158','0000927608','0000927610','0000945321'))
              PIVOT (COUNT(received_date)
                     FOR received_date in (1 as Sunday, 2 as Saturday)))
      ORDER BY r_number';

  DBMS_OUTPUT.PUT_LINE('R_NUMBER' || tab || 'HOLDER' || tab ||
                       strSaturday_column || tab || strSunday_column);
  LOOP
    FETCH rc
      INTO nR_number,
           strHolder,
           nSaturday,
           nSunday;
    EXIT WHEN rc%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE(nR_number || tab || strHolder || tab ||
                         nSaturday || tab || nSunday);
  END LOOP;
END;