SQL 如何實現動態的行列轉置

xiaohuihui發表於2020-06-17

Oracle 和新版 Mysql 裡有 pivot 實現行列轉置,但實際處理資料時,會碰到一些更復雜的轉置情況,pivot 也搞不定,比如:

1png

想轉置成:

2png

這個難點在於事先不知道有多少種收入來源,而且每個人的收入來源種類各不相同。先得計算出種類個數,根據個數動態生成表結構,然後按照順序填充每個人的多個收入資料。

SQL 的計算過程不提倡分步,對集合操作支援的也不徹底,很難應付這種多步驟複雜計算。

如果用集算器的 SPL 語言來處理,就能輕鬆實現:


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 格子根據原始資料得到期望資料結構的空表;B4 格子得到每個人要填充入空表的資料。

如果不用複雜計算得到結果列,只是根據某個欄位值動態生成列,直接用 pivot 函式就可以;具體的列都不用指定,根據欄位值自動生成:
=connect(”mysqlDB”).query(“select * from t”).pivot(g1;g2,f)。

除了動態行列轉置,還有雙向轉置、轉置同時存在列間運算等複雜轉置需求,這些計算用 SPL 都容易編寫出來,參考 。

 

集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱

當資料不在資料庫裡時,SPL 執行復雜計算仍然方便:
=file(“d:/t.csv”).import(;,",").pivot...

SPL能很方便地嵌入到JAVA應用,可參考 。

具體使用方法可參考 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2698821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章