sql >> データベース >  >> RDS >> Oracle

PIVOT 句の動的クエリ

    次のようなもの:

    VARIABLE cur REFCURSOR;
    
    DECLARE
      dates VARCHAR2(4000);
      start_date DATE := DATE '2017-09-18';
      end_date   DATE := DATE '2017-09-19';
    BEGIN
      SELECT LISTAGG(
               'DATE ''' || TO_CHAR( dt, 'YYYY-MM-DD' )
               || ''' AS "' || TO_CHAR( dt, 'FMDY-DD' ) || '"',
               ','
             ) WITHIN GROUP ( ORDER BY dt )
      INTO   dates
      FROM   (
        SELECT start_date + LEVEL - 1 AS dt
        FROM   DUAL
        CONNECT BY LEVEL <= end_date - start_date + 1
      );
    
      OPEN :cur FOR
      'SELECT * FROM (
         SELECT t.*,
                MIN( start_date ) OVER ( PARTITION BY prod_id ) AS min_start_date,
                SUM( tot_hours  ) OVER ( PARTITION BY prod_id ) AS prod_tot_hours
         FROM   prod_timings t
         WHERE  start_date BETWEEN :1 AND :2
       )
       PIVOT (
         SUM( tot_hours )
         FOR start_date IN (' || dates || ')
       )
       ORDER BY prod_id'
       USING start_date, end_date;
    END;
    /
    
    PRINT cur;
      

    1. データベースが更新されていません

    2. 同じテーブルから異なる値の複数の行を選択します

    3. RAMを考慮したURLまたはハッシュのインデックス

    4. プロファイルを使用してOracleのパスワードとリソースを管理する