在oracle sql中替代PIVOT

时间:2021-03-19 16:23:41

标签: 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-MAR-21
0000928158 LVAD 紧急情况 (AH) 16-MAR-21
0000927610 接收/药房 15-MAR-21

输出是

enter image description here

问题:如何获取日期而不是天

1 个答案:

答案 0 :(得分:1)

您需要在 PL/SQL 块中使用动态 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;
相关问题