【问题标题】:SQLPlus Pivot Date ColumnSQLPlus 透视日期列
【发布时间】:2020-09-23 17:06:39
【问题描述】:

我有一个查询,我需要在其中旋转一个包含多个日期的字段。简而言之,manageddate 列需要转为 6 列,其中日期从最新到最旧。

我目前的努力如下

SELECT student_number,
       wheninput,
       whoinput,
       certificatetype,
       MAX(CASE
             WHEN vaccine_name = 'DTP' THEN
              TO_CHAR(administereddate, 'mm/dd/yyyy')
             ELSE
              ''
           END) AS "DTP"
  FROM 
 (
  SELECT TO_CHAR(administeredDate, 'mm/dd/yyyy') dose_date,
         ROW_NUMBER() OVER (PARTITION BY vaccine_name ORDER BY administereddate DESC) dose
    FROM ps.pshealthgrade1) 
   PIVOT(
         LISTAGG(dose_date) WITHIN GROUP (ORDER BY dose_date DESC) 
                                   FOR dose IN (1 DTP_dose1,
                                                2 DTP_dose2,
                                                3 DTP_dose3,
                                                4 DTP_dose4,
                                                5 DTP_dose5,
                                                6 DTP_dose6)
         )
  )
 WHERE vaccine_name = 'DTP'
 GROUP BY student_number,
          wheninput,
          whoinput,
          vaccine_name,
          administereddate,
          certificatetype
 ORDER BY student_number, vaccine_name, administereddate;

【问题讨论】:

    标签: sql oracle plsql pivot sqlplus


    【解决方案1】:

    您需要动态检测可能每天计算的最近六个疫苗日期。为了做到这一点,首先创建这样一个函数;

    CREATE OR REPLACE FUNCTION get_vaccine_rs(
                                              i_vcc  ps.pshealthgrade1.vaccine_name%TYPE 
                                             ) RETURN SYS_REFCURSOR IS
      v_recordset SYS_REFCURSOR;
      v_sql       VARCHAR2(32767);
      v_str       VARCHAR2(32767);
    BEGIN
      SELECT LISTAGG( ''''||TO_CHAR(administeredDate, 'mm/dd/yyyy')||''' AS "DTP_dose'||rn||'"' , ',' ) 
                     WITHIN GROUP ( ORDER BY rn )
        INTO v_str                 
        FROM ( SELECT *
                 FROM
                 ( SELECT administeredDate, ROW_NUMBER() OVER (ORDER BY administeredDate DESC) AS rn 
                     FROM ( SELECT DISTINCT administeredDate 
                              FROM ps.pshealthgrade1 
                             WHERE vaccine_name = i_vcc )
                 )
                WHERE rn <= 6 );             
    
      v_sql :=
      'SELECT *
         FROM ps.pshealthgrade1
        PIVOT
        (
         COUNT(*) FOR administeredDate IN ( '|| v_str ||' )
        )
        ';
    
      OPEN v_recordset FOR v_sql USING i_vcc;
      RETURN v_recordset;
    END;
    /
    

    然后运行以下代码:

    VAR rc REFCURSOR
    EXEC :rc := get_vaccine_rs('DTP');
    PRINT rc
    

    从 SQL Developer 的命令行查看结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-27
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      相关资源
      最近更新 更多