溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL 如何實(shí)現(xiàn)動(dòng)態(tài)的行列轉(zhuǎn)置

發(fā)布時(shí)間:2020-08-11 18:45:18 來(lái)源:ITPUB博客 閱讀:406 作者:rqgxy 欄目:數(shù)據(jù)庫(kù)

Oracle 和新版 Mysql 里有 pivot 實(shí)現(xiàn)行列轉(zhuǎn)置,但實(shí)際處理數(shù)據(jù)時(shí),會(huì)碰到一些更復(fù)雜的轉(zhuǎn)置情況,pivot 也搞不定,比如:

SQL 如何實(shí)現(xiàn)動(dòng)態(tài)的行列轉(zhuǎn)置

想轉(zhuǎn)置成:

SQL 如何實(shí)現(xiàn)動(dòng)態(tài)的行列轉(zhuǎn)置

這個(gè)難點(diǎn)在于事先不知道有多少種收入來(lái)源,而且每個(gè)人的收入來(lái)源種類各不相同。先得計(jì)算出種類個(gè)數(shù),根據(jù)個(gè)數(shù)動(dòng)態(tài)生成表結(jié)構(gòu),然后按照順序填充每個(gè)人的多個(gè)收入數(shù)據(jù)。

SQL 的計(jì)算過(guò)程不提倡分步,對(duì)集合操作支持的也不徹底,很難應(yīng)付這種多步驟復(fù)雜計(jì)算。

如果用集算器的 SPL 語(yǔ)言來(lái)處理,就能輕松實(shí)現(xiàn):


A B
1 =connect("db") =A1.query("select * from Income")
2 =B1.group(Name) =A2.max(~.len())
3 =create(Name,${B2.("Source"+string(~)+",Income"+string(~)).concat@c()})
4 for A2 =A4.Name|A4.conj([Source,Income])
5
>A3.record(B4)

A3 格子根據(jù)原始數(shù)據(jù)得到期望數(shù)據(jù)結(jié)構(gòu)的空表;B4 格子得到每個(gè)人要填充入空表的數(shù)據(jù)。

如果不用復(fù)雜計(jì)算得到結(jié)果列,只是根據(jù)某個(gè)字段值動(dòng)態(tài)生成列,直接用 pivot 函數(shù)就可以;具體的列都不用指定,根據(jù)字段值自動(dòng)生成:
=connect(”mysqlDB”).query(“select * from t”).pivot(g1;g2,f)。

除了動(dòng)態(tài)行列轉(zhuǎn)置,還有雙向轉(zhuǎn)置、轉(zhuǎn)置同時(shí)存在列間運(yùn)算等復(fù)雜轉(zhuǎn)置需求,這些計(jì)算用 SPL 都容易編寫(xiě)出來(lái),參考 《轉(zhuǎn)置》。

集算器 SPL 是解決 SQL 難題的專業(yè)腳本語(yǔ)言,它語(yǔ)法簡(jiǎn)單,符合自然思維,是天然分步、層次清晰的面向過(guò)程計(jì)算語(yǔ)言。它采用與數(shù)據(jù)庫(kù)無(wú)關(guān)的統(tǒng)一語(yǔ)法,編寫(xiě)的算法可在數(shù)據(jù)庫(kù)間無(wú)縫遷移。它是桌面級(jí)計(jì)算工具,即裝即用,配置簡(jiǎn)單,調(diào)試功能完善,可設(shè)置斷點(diǎn)、單步執(zhí)行,每步執(zhí)行結(jié)果都可查看。請(qǐng)參閱 SQL 解題手

當(dāng)數(shù)據(jù)不在數(shù)據(jù)庫(kù)里時(shí),SPL 執(zhí)行復(fù)雜計(jì)算仍然方便:
=file(“d:/t.csv”).import(;,",").pivot...

SPL能很方便地嵌入到JAVA應(yīng)用,可參考 《Java 如何調(diào)用 SPL 腳本》。

具體使用方法可參考  《如何使用集算器》。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI