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

青灯夜游
リリース: 2022-01-25 17:23:11
オリジナル
48295 人が閲覧しました

行-列変換を実装する方法: 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!