SPL 簡化 SQL 案例詳解:豎排多層數據

在數據庫應用開發中,我們有時會需要將具有層次的分組數據“扁平化”,按順序拼為一列,通過不同類型的標識來區別分組和明細,如下所示:

SPL 簡化 SQL 案例詳解:豎排多層數據

此類需求常見於為報表整理數據,對於SQL來說,屬於比較複雜的計算。因為SQL缺少有序集合的機制,需要對分組和明細分別設置用於排序的計算列,再將分組和明細合併,最後做排序。為了實現這種算法,SQL往往要用非ansi標準的特殊函數去實現,代碼比較難寫,也不易理解。如果需要對層級更多的分組進行拼湊,將更加難以實現。

而藉助SPL語言實現此類算法則無需計算列,代碼簡潔易懂。下面用一個例子來說明。

計算目標:

針對DVDCopy表,將門店及其對應的DVD拷貝拼為一列。

數據結構:

DVD表的前三個字段是:CopyID、DVDID、BID,分別代表DVD拷貝的編號、DVD的編號、門店的編號,其中,DVD拷貝和門店是多對1的關係。部分數據如下:


SPL 簡化 SQL 案例詳解:豎排多層數據

現在需要將DVD編號和門店編號進行彙總,通過類型進行區分,計算結果應該是這樣的:

SPL 簡化 SQL 案例詳解:豎排多層數據

SPL代碼:


SPL 簡化 SQL 案例詳解:豎排多層數據


A1:查詢表DVDCopy,結果對BID排序,部分結果如下圖所示:

SPL 簡化 SQL 案例詳解:豎排多層數據

A2:=create(value,type)。建立一個空序表A2,有value和type這兩個字段。

A3:for A1表示對A1進行循環遍歷,每次取A1中的一條記錄,在循環體中可以用變量A3來訪問當前記錄,比如A3.BID。循環語句的作用範圍可以直接用單元格縮進來表示,A3的作用範圍即B3:C4。

B3:C4:遍歷A1中的數據,並向A2追加BID和CopyID。具體算法是:利用網格B2記錄當前門店編碼BID(初始為空),如果當前記錄的BID發生了變化(B3中的代碼),則在A2中追加一條門店記錄(C3中的代碼);修改B2為當前記錄的BID(B4中的代碼),以便在下一條記錄中比較BID是否發生變化;追加一條DVD拷貝記錄(C4中的代碼)。

循環遍歷後,最終計算結果會存儲在A2中,如下圖:

SPL 簡化 SQL 案例詳解:豎排多層數據

延伸:拼合多層分組

前面的案例假設數據只有兩層:BID和CopyID,事實上BID、DVDID、CopyID可以組成三層數據。如果需要彙總三類編號,可以依靠類似的辦法把三層數據拼成一列,SPL代碼如下:


SPL 簡化 SQL 案例詳解:豎排多層數據

計算結果如下所示:

SPL 簡化 SQL 案例詳解:豎排多層數據

對於計算結果,除了導出數據,SPL還可以直接以被調用的方式向報表工具或java程序提供數據,調用方法和普通數據庫相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的計算結果,具體方法可參考相關文檔。


分享到:


相關文章: