偶発Oracle明細転記


行転列はデータベースで一般的な操作であるはずです.oracleではpivot、decodeを使用して、ボケのblogを参照できます.
http://blog.csdn.net/ch7543658/article/details/41146809
SELECT name,
        MAX(DECODE(course, 'java', gread)) AS java,
        MAX(DECODE(course, 'c#', gread)) AS c#,
        MAX(DECODE(course, 'c', gread)) AS c,
        MAX(DECODE(course, 'sql', gread)) AS sql
FROM t
GROUP BY name;

NAME             JAVA         C#          C        SQL
---------- ---------- ---------- ---------- ----------
dai                60         70         80         90
tu                 90         80         70         60

実際にレポートを書くときに、変異的な行の列変更の要求に遭遇しました.
データ列pocket_ID,Serial_Numberは約50行以上のレコードを調べました.
偶遇Oracle行转列_第1张图片
リクエストはpocket_IDの順番はserial_Numberは行ごとに8つのデータのフォーマットで書きます.
は、ボケの例に比べて適切なgroupフィールドがないため、ステップテーブルをレポートに変換するのに少し工夫し、補助フィールドを追加して必要な機能を実現しました.
select max(A) as A,max(B) as B,max(C) as C,max(D) as D,max(E) As E,max(F) As F,max(G) as G,Max(H) as H from 
(SELECT trunc((P.POCKET_ID-1)/8,0) as RM,
       DECODE(MOD(POCKET_ID,  8), 1, SERIAL_NUMBER) AS A,
       DECODE(MOD(POCKET_ID,  8), 2, SERIAL_NUMBER) AS B,
       DECODE(MOD(POCKET_ID,  8), 3, SERIAL_NUMBER) AS C,
       DECODE(MOD(POCKET_ID,  8), 4, SERIAL_NUMBER) AS D,
       DECODE(MOD(POCKET_ID,  8), 5, SERIAL_NUMBER) AS E,
       DECODE(MOD(POCKET_ID,  8), 6, SERIAL_NUMBER) AS F,
       DECODE(MOD(POCKET_ID,  8), 7, SERIAL_NUMBER) AS G,
       DECODE(MOD(POCKET_ID,  8), 0, SERIAL_NUMBER) AS H 
  FROM      
WHERE 1 = 1
   and     
ORDER BY POCKET_ID asc) M
group by M.RM order by RM asc
クエリー結果: