1. 程式人生 > >專案上線,舊資料需要修改,寫SQL太麻煩,看Excel配合簡單SQL的強大功能

專案上線,舊資料需要修改,寫SQL太麻煩,看Excel配合簡單SQL的強大功能

實際場景

A專案前期上線後有兩張表,第一張表裡面有訂單的基本資訊(重點:沒有訂單完成時間),第二張表記錄訂單的流程節點資訊,如買車這個訂單,走的流程節點有交定金、交首付、貸款申請、貸款審批……取車,每個節點都有開始時間和完成時間記錄,當所有節點都完成後,會自動將訂單的狀態更新為完成狀態。後期迭代需求生成報表,需要統計訂單整個執行流程的時間。那麼這個時候的基本構思就是取訂單的建立時間未開始時間和最後一個節點的完成時間作為結束時間計算執行流程時間。這樣不太方便,為了更好的利於報表統計,需要在訂單表中加一個完成時間欄位,但是存在一個問題就是線上舊的資料中會出現完成時間都為空的現象,這個時候需要手動的取這個模組的節點最後完成時間,將這個時間填充到訂單表新加欄位完成時間上,直接寫SQL需要先select再update,而且需要根據訂單號匹配到對應節點和訂單關聯。覺得不太容易些,如果通過上線自動執行載入任務在程式碼中來實現,下次上線把這段程式碼再去掉。這個好像有點折騰。SQL不容易寫,程式碼實現不友好,那就繼續往下看,也許就是你想要的驚喜。

excel批量生產SQL

基本思路

之前說寫SQL比較麻煩,因為需要select以後再update,直接一句SQL不能實現,那我們就分開來寫,先select出資料,然後再根據結果寫update,但是如果update資料很多,幾條還可以,幾百條几萬條估計你就受不了了,一天的時候都寫不完,還很容易出錯。這段說明的結論:一句SQL不行,就分開執行,分離開執行,分開執行語句太多,寫起來很麻煩。

表的設計

最簡化的表格欄位設計如下。
訂單表
編號(id)|訂單人(order_person)|訂單金額(order_amount)|建立時間(created_time)
節點表
編號(id)|訂單編號(order_id)|節點名稱(phase_name)|節點狀態(phase_status)|完成時間(complete_date)

select查詢需要的資料
select tor.id,max(ph.complete_date) max_date from tab_order tor,tab_phase ph where ph.phase_status = 1 and tor.id = ph.order_id group by tor.id

這個時候我們獲取到了對應的訂單編號和最新的完成時間,只需要使用update語句就可以實現上面的場景需求,如果對照著一句一句寫,估計會眼瞎、手殘,直接猝死的。如果使用update語句,怎麼實現,也許可以,但是這裡不使用,這裡採用更簡單的方式。

將資料放到excel表格中
方式一:使用工具查詢到結果

這裡使用工具意思是使用例如navicat這樣的軟體,直接把查出來的資料複製貼上到excel表格中就可以了,但是對於稍微正規一點的公司,生產庫是不可以這樣直接連線的。

方式二:dba提供或者命令列查詢資料

上面的複製貼上方式很簡單,不贅述,主要講一下下面的這種方式。通過dba在資料庫裡面查詢或者自己通過xshell、CRT連線伺服器通過命令查詢,往往查詢查詢出來的結果是這樣的。

+-------+-----------------------+
 |  id      |        max_date            |
+-------+-----------------------+
 |     1    | 2018-04-16 12:12:12 |
 |     2    | 2018-04-17 12:12:12 |
 |     3    | 2018-04-18 12:12:12 |
 |     4    | 2018-04-19 12:12:12 |
+-------+-----------------------+

複製出來不能直接放到excel,會亂掉,只能放在txt文字檔案中,這裡還有要注意的是”|”符號和值之前的空格需要去掉,這個使用查詢替換即可,取出後的txt中的內容是這樣的。(表頭內容和外框虛線都去掉)

|1|2018-04-16 12:12:12|
|2|2018-04-17 12:12:12|
|3|2018-04-18 12:12:12|
|4|2018-04-19 12:12:12|
資料匯入excel表格

說明:用的excel版本是2010的。
新建一個excel表格–>找到表頭選項卡中的”資料”–>自文字–>選擇之前準備好的txt檔案–>原始資料型別選擇”分隔符號”–>下一步–>分隔符號選擇”其他”,輸入框裡輸入”|”–>下一步–>前後會多出來兩列空白列,選中然後對應的列資料格式設定為不匯入此列–>中間有數值的列設定列資料格式為文字(都是文字,包括日期也選擇文字)–>完成–>確定。OK!到此資料匯入成功。

批量生成update語句SQL
="update tab_order set complete_date ='" & A1 & "' where id =" & B1 & ";"

這個表示式放在第一行資料的後一個單元格里面,您會發現一個SQL已經生成,接下來就是下拉這個單元格填充,然後就會生成n條對應的update語句,然後選中所有SQL,複製出來,貼上到txt檔案,到此批量生成的update語句就可以到線上環境執行啦。是不是很簡單。

說明

1、這裡舉例只是個例子,不要太過於糾結例子的合理性;
2、這只是一種生成方式,不同的公司,不同的專案,不同的資料庫,執行起來的方式不一樣,例子只說怎麼用。