#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;