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

私の場合、OracleでSQLを作成するにはどうすればよいですか?

    標準のPIVOTを使用する必要があります クエリ。

    Oracleデータベースのバージョンによって異なります 、2つの方法でそれを行うことができます:

    PIVOTの使用 バージョン11gの場合 以上:

    SQL> SELECT *
      2  FROM
      3    (SELECT c.place place,
      4      row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
      5      (row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
      6      COUNT(place) OVER(ORDER BY NULL))*100 pct
      7    FROM person_injuryPlace_map A
      8    JOIN person b
      9    ON(A.person_id = b.ID)
     10    JOIN injury_place c
     11    ON(A.injury_id = c.ID)
     12    ORDER BY c.place
     13    ) PIVOT (MAX(cnt),
     14             MAX(pct) pct
     15             FOR (place) IN ('kitchen' AS kitchen,
     16                             'Washroom' AS Washroom,
     17                             'Rooftop' AS Rooftop,
     18                             'Garden' AS Garden));
    
       KITCHEN KITCHEN_PCT   WASHROOM WASHROOM_PCT    ROOFTOP ROOFTOP_PCT     GARDEN GARDEN_PCT
    ---------- ----------- ---------- ------------ ---------- ----------- ---------- ----------
             1  14.2857143          3   42.8571429          1  14.2857143          2 28.5714286
    

    MAXの使用 およびデコード バージョン10gの場合 以前:

    SQL> SELECT MAX(DECODE(t.place,'kitchen',cnt)) Kitchen ,
      2    MAX(DECODE(t.place,'kitchen',pct)) Pct ,
      3    MAX(DECODE(t.place,'Washroom',cnt)) Washroom ,
      4    MAX(DECODE(t.place,'Washroom',pct)) Pct ,
      5    MAX(DECODE(t.place,'Rooftop',cnt)) Rooftop ,
      6    MAX(DECODE(t.place,'Rooftop',pct)) Pct ,
      7    MAX(DECODE(t.place,'Garden',cnt)) Garden ,
      8    MAX(DECODE(t.place,'Garden',pct)) Pct
      9  FROM
     10    (SELECT b.ID bid,
     11      b.NAME NAME,
     12      c.ID cid,
     13      c.place place,
     14      row_number() OVER(PARTITION BY c.place ORDER BY NULL) cnt,
     15      ROUND((row_number() OVER(PARTITION BY c.place ORDER BY NULL)/
     16      COUNT(place) OVER(ORDER BY NULL))*100, 2) pct
     17    FROM person_injuryPlace_map A
     18    JOIN person b
     19    ON(A.person_id = b.ID)
     20    JOIN injury_place c
     21    ON(A.injury_id = c.ID)
     22    ORDER BY c.place
     23    ) t;
    
       KITCHEN        PCT   WASHROOM        PCT    ROOFTOP        PCT     GARDEN        PCT
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
             1      14.29          3      42.86          1      14.29          2      28.57
    


    1. LinuxのSQLServerAzure/2022データベース元帳テーブル。

    2. PostgreSQLをリモートで管理するためのヒント

    3. Slick2.0の一般的なCRUD操作

    4. OracleDatabaseからMariaDBへの移行-知っておくべきこと