一、前言
二、簡(jiǎn)述
1、行轉(zhuǎn)列概念
2、列轉(zhuǎn)行概念
三、GaussDB數(shù)據(jù)庫(kù)的行列轉(zhuǎn)行實(shí)驗(yàn)示例
1、行轉(zhuǎn)列示例
1)創(chuàng)建實(shí)驗(yàn)表(行存表)
2)靜態(tài)行轉(zhuǎn)列
3)行轉(zhuǎn)列(結(jié)果值:拼接式)
4)動(dòng)態(tài)行轉(zhuǎn)列(拼接SQL式)
2、列轉(zhuǎn)行示例
1)創(chuàng)建實(shí)驗(yàn)表(復(fù)用前面的測(cè)試數(shù)據(jù))
2)使用union all,將各科目(數(shù)學(xué)、英語(yǔ)、語(yǔ)文)整合為一列
四、小結(jié)
一、前言
在構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)或做數(shù)據(jù)分析時(shí),需要對(duì)原始數(shù)據(jù)的結(jié)構(gòu)進(jìn)行一定的處理,有時(shí)涉及到“行轉(zhuǎn)列”,有時(shí)涉及到“列轉(zhuǎn)行”,那么這兩個(gè)轉(zhuǎn)換的方式具體是什么,有什么差異,怎么實(shí)現(xiàn),今天我們將以GaussDB數(shù)據(jù)庫(kù)為例,給大家做一下講解。
二、簡(jiǎn)述
1、行轉(zhuǎn)列概念
即將多行一列數(shù)據(jù)轉(zhuǎn)為一行多列顯示。通常轉(zhuǎn)化后將某一列分類(lèi)后的值作為新的列名,將此值對(duì)應(yīng)的多行數(shù)據(jù)顯示成一行。
2、列轉(zhuǎn)行概念
即將一行多列數(shù)據(jù)轉(zhuǎn)成多行一列顯示。通常將轉(zhuǎn)化后的列名為某一行中某一列的值,來(lái)識(shí)別原先對(duì)應(yīng)的數(shù)據(jù)。
三、GaussDB數(shù)據(jù)庫(kù)的行列轉(zhuǎn)行實(shí)驗(yàn)示例
用一張學(xué)生成績(jī)來(lái)舉例:從老師的角度,在錄入成績(jī)時(shí),每科老師都會(huì)單獨(dú)錄入每個(gè)學(xué)生的本科成績(jī)。而從學(xué)生的角度,學(xué)生只關(guān)心自己各科的成績(jī)分別是多少。所以如果把老師錄入數(shù)據(jù)作為原始表,那么學(xué)生查看自己的成績(jī)時(shí)就要用到行轉(zhuǎn)列,如果讓學(xué)生上報(bào)自己各科的成績(jī),然后老師去查對(duì)應(yīng)學(xué)科的學(xué)生考試成績(jī)時(shí),那就是列轉(zhuǎn)行了。
1、行轉(zhuǎn)列示例
1)創(chuàng)建實(shí)驗(yàn)表(行存表)
--創(chuàng)建實(shí)驗(yàn)表(行存表)
CREATE TABLE grade(
name VARCHAR(10)
,course VARCHAR(10)
,score INT);
--初始化測(cè)試數(shù)據(jù)
INSERT INTO grade VALUES ('張三','數(shù)學(xué)',80);
INSERT INTO grade VALUES ('張三','英語(yǔ)',88);
INSERT INTO grade VALUES ('張三','語(yǔ)文',95);
INSERT INTO grade VALUES ('李四','數(shù)學(xué)',88);
INSERT INTO grade VALUES ('李四','英語(yǔ)',70);
INSERT INTO grade VALUES ('李四','語(yǔ)文',93);
--查看結(jié)果
SELECT * FROM grade ORDER BY course;
2)靜態(tài)行轉(zhuǎn)列
使用sum、case when的方式:
--靜態(tài)行轉(zhuǎn)列
SELECT name
,sum(case when course = '數(shù)學(xué)' then score else 0 end) AS "數(shù)學(xué)"
,sum(case when course = '英語(yǔ)' then score else 0 end) AS 英語(yǔ)
,sum(case when course = '語(yǔ)文' then score else 0 end) AS 語(yǔ)文
FROM grade
GROUP BY name;
3)行轉(zhuǎn)列(結(jié)果值:拼接式)
使用listagg within group:
--行轉(zhuǎn)列(結(jié)果值:拼接式)
SELECT name, LISTAGG(score,',') WITHIN GROUP (ORDER BY course) FROM grade GROUP BY name;
4)動(dòng)態(tài)行轉(zhuǎn)列(拼接SQL式)
通過(guò)“l(fā)istagg + 創(chuàng)建FUNCTION + VIEW”的方式實(shí)現(xiàn)
--動(dòng)態(tài)行轉(zhuǎn)列(SQL拼接式)
SELECT listagg(concat('SUM(CASE WHEN course = ''', course, ''' THEN score ELSE 0 END) AS "', course,'"'),',') WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);
--concat_text的結(jié)果:
SUM(CASE WHEN course = '數(shù)學(xué)' THEN score ELSE 0 END) AS "數(shù)學(xué)",SUM(CASE WHEN course = '英語(yǔ)' THEN score ELSE 0 END) AS "英語(yǔ)",SUM(CASE WHEN course = '語(yǔ)文' THEN score ELSE 0 END) AS "語(yǔ)文"
--創(chuàng)建一個(gè)函數(shù)。
CREATE OR REPLACE FUNCTION fun_test()
RETURNS VOID
LANGUAGE SQL
AS $$ DECLARE
s_sql text;
rec record;
BEGIN
s_sql := 'SELECT listagg(CONCAT(''SUM(CASE WHEN course = '''''', course, '''''' THEN score ELSE 0 END) AS "'', course, ''"'' ),'','' ) WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);';
EXECUTE s_sql INTO rec;
s_sql := 'DROP VIEW IF EXISTS v_score; CREATE VIEW v_score AS SELECT name, ' || rec.concat_text || ' FROM grade GROUP BY name;';
EXECUTE s_sql;
END $$;
--調(diào)用
CALL fun_test();
--查看執(zhí)行結(jié)果
select * from v_score;
Tip:請(qǐng)注意SQL拼寫(xiě)時(shí)的英文單引號(hào)、雙引號(hào)。
2、列轉(zhuǎn)行示例
1)創(chuàng)建實(shí)驗(yàn)表(復(fù)用前面的測(cè)試數(shù)據(jù))
--創(chuàng)建實(shí)驗(yàn)表(復(fù)用前面的測(cè)試數(shù)據(jù))
CREATE TABLE grade1 AS
SELECT name
,sum(case when course = '數(shù)學(xué)' then score else 0 end) AS "數(shù)學(xué)"
,sum(case when course = '英語(yǔ)' then score else 0 end) AS 英語(yǔ)
,sum(case when course = '語(yǔ)文' then score else 0 end) AS 語(yǔ)文
FROM grade
GROUP BY name;
--查看結(jié)果
SELECT * FROM grade1;
2)使用union all,將各科目(數(shù)學(xué)、英語(yǔ)、語(yǔ)文)整合為一列
--使用union all,將各科目(數(shù)學(xué)、英語(yǔ)、語(yǔ)文)整合為一列
SELECT * FROM
(
SELECT name, '數(shù)學(xué)' AS course, 數(shù)學(xué) AS score FROM grade1
union all
SELECT name, '英語(yǔ)' AS course, 英語(yǔ) AS score FROM grade1
union all
SELECT name, '語(yǔ)文' AS course, 語(yǔ)文 AS score FROM grade1
)
order by name;
四、小結(jié)
行列互轉(zhuǎn)在一些數(shù)據(jù)庫(kù)使用場(chǎng)景中經(jīng)常用到,比如數(shù)據(jù)分析、數(shù)倉(cāng)建設(shè)等。但不同的數(shù)據(jù)庫(kù)軟件有著不同處理方式,但是行列換的基本思路是一致的。本文主要是以GaussDB數(shù)據(jù)為平臺(tái),為大家做了簡(jiǎn)單的講述 ,歡迎測(cè)試。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-689405.html
——結(jié)束文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-689405.html
到了這里,關(guān)于GaussDB數(shù)據(jù)庫(kù)SQL系列-行列轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!