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

SQLDeveloperOracleを使用した動的ピボットクエリ

    あなたは正しい方向に進んでいますが、少なくとも1人の生徒に複数のクラスが定義されている場合、そのケースは失敗します。 ROW_NUMBER() 内の分析関数が問題を解決します。したがって、SYS_REFCURSORを含むストアド関数を作成します :

    CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
      recordset SYS_REFCURSOR;
      sqlqry    VARCHAR2(32767);
      cols      VARCHAR2(32767);
    BEGIN
      SELECT LISTAGG(''''||name||''' AS "'||name||'"' ,',') WITHIN GROUP (ORDER BY 0)
        INTO cols
        FROM ( SELECT DISTINCT name FROM Students );  
    
      sqlqry :=
      'SELECT *
         FROM 
         (
          SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,
                 s.*             
            FROM Students s     
          )
        PIVOT (
               MAX(class) FOR name IN ('||cols||')
               )
        ORDER BY rn';
    
      OPEN recordset FOR sqlqry;
      RETURN recordset;
    END;
    /
    

    もう1つのレコードが挿入されていると仮定します;

    Name     School    Class
    ----     ------    -------
    Jim      Hs        History
    

    次に

    を呼び出します
    VAR rc REFCURSOR
    EXEC :rc := get_student_rs;
    PRINT rc
    

    SQL Developerから 結果セットを表示するためののコマンドライン:

    RN  SCHOOL  Jim      John     Matthew  Steve
    --  ------  -------  -------  -------  ------
    1   Hs      Maths    English  Science  Maths
    2   Hs      History 
    
        
    



    1. MySQLストアドプロシージャまたはPHPコード?

    2. SybaseASEへの複数の行の挿入

    3. データベースmysqlに画像を保存する

    4. 挿入された出力値をSQLサーバーの変数に割り当てるにはどうすればよいですか?