ホームページ  >  記事  >  データベース  >  Oracleで行と列の変換を実現する方法

Oracleで行と列の変換を実現する方法

青灯夜游
青灯夜游オリジナル
2022-01-25 17:23:1148300ブラウズ

行-列変換を実装する方法: 1. PIVOT() 関数を使用して、行から列への変換を実装します。構文は「SELECT * FROM (データ セット) PIVOT (SUM(Score) FOR coursename」です。 IN (変換された列の値))" "; 2. unpivot() 関数を使用して列の切り替えを実現します。

Oracleで行と列の変換を実現する方法

このチュートリアルの動作環境: Windows 7 システム、Oracle 11g バージョン、Dell G3 コンピューター。

Oracle 行から列へ

Oracle 行から列へは、特定のフィールドの値を唯一の値として使用し、その後、別のフィールドの行の値をその列の値に変換します。ここでも、例としてシステムの生徒のスコア テーブルを使用します。スコア テーブルのレコード (行) は、各科目の各生徒のスコアに対応します。次に、各生徒のすべての科目を 1 つとして表示するレポートを作成する必要があります。コラムの公演情報です。ケースデータは次のとおりです。

Oracleで行と列の変換を実現する方法

#それでは、どうすればそれを達成できるでしょうか?いくつかの方法を 1 つずつ説明します:

1. まず最初に考えなければならないのは、Oracle のグループ化 (グループ化) が使用できることです。実装コードは次のとおりです:

select c.stuname,
       --利用分组聚合函数       sum(decode(b.coursename, '英语(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '数学(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '语文(2018上学期)', t.score, 0)) as "英语(2018上学期)"  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid
 group by c.stuname

学生をグループ化するために group by を使用し、デコードを使用して対応するコースの成績値を変換し、それを合計して成績の結果値を取得します。結果は次のとおりです:

Oracleで行と列の変換を実現する方法

2 、Oracle11g では、この行から列への要件を完全に解決できる組み込み関数 PIVOT が提供されます。具体的な構文構造は次のとおりです:

SELECT * FROM (数据查询集)PIVOT 
(
 SUM(Score/*行转列后 列的值*/) FOR 
 coursename/*需要行转列的列*/ IN (转换后列的值)
)

具体的なコードは次のとおりです:

select * from  (select c.stuname,
       b.coursename,
       t.score
  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid )  /*数据源*/PIVOT 
(
 SUM(score/*行转列后 列的值*/) 
 FOR coursename/*需要行转列的列*/ IN ('英语(2018上学期)' as 英语,'数学(2018上学期)' as 数学,'语文(2018上学期)' as 语文 )
) ;

結果は次のとおりです:

Oracleで行と列の変換を実現する方法

Oracle の列から行への変換

Oracle の列から行への変換は、行の一意の値に従って行内の列のフィールドを変換し、複数行のデータに変換します。たとえば、上記の Oracle の行から列への変換における生徒の成績表の基本データは、1 人の生徒の科目の成績が 1 つのレコードに対応するというものです。次に、行を列に変換し、各列の生徒の得点 (数学、英語、中国語) に対応するレコードに変換しました。そこで今回の記事は、以前変換した生徒成績表(バックアップ表score_copy)を再度列と行に変換して元のデータに変換するというものです。ケースデータは次のとおりです:

Oracleで行と列の変換を実現する方法

Oracleで行と列の変換を実現する方法

#それでは、列の切り替えをどのように実装すればよいでしょうか?一般的に使用される 2 つの方法を以下に紹介します:

1. スプライシングには Union All を使用します。これにより、対応する列を行レコードに完全に変換できます。具体的なコードは次のとおりです:

select t.stuname, '英语' as coursename ,t.英语 as score  from SCORE_COPY t
union all
select t.stuname, '数学' as coursename ,t.数学 as score  from SCORE_COPY t
union all
select t.stuname, '语文' as coursename ,t.语文 as score  from SCORE_COPY t

結果は次のとおりです。

Oracleで行と列の変換を実現する方法

2. この問題は、Oracle 独自の列から行への関数 unpivot を使用することによっても完全に解決できます。具体的な構文構造は次のとおりです:

select 字段 from 数据集
unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

実装コードは次のとおりです。

select stuname, coursename ,score from
score_copy  t
unpivot
(score for coursename in (英语,数学,语文))

結果は次のとおりです。

Oracleで行と列の変換を実現する方法

推奨チュートリアル: 「

Oracle Tutorial##」 #"

以上がOracleで行と列の変換を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。