■ 湖北 雷應(yīng)兵
前一段時(shí)間,筆者接到一個(gè)非常棘手的問題:某部門有29111筆共796余萬元的款項(xiàng),需要通過銀行代發(fā)到用戶的存折上,該部門將需要發(fā)放的Excel表拷貝給代發(fā)銀行后,由于銀行具體操作人員經(jīng)驗(yàn)不足,將電子表格順序和部分內(nèi)容進(jìn)行了更改。
仔細(xì)對(duì)比分析兩個(gè)表后,發(fā)現(xiàn)以下情況:1.該部門提供的原表(以下簡(jiǎn)稱“原表”)是29111筆7964331.30元,銀行返回來的表(以下簡(jiǎn)稱“銀行返表”)顯示應(yīng)代發(fā)金額是7964331.11元,代發(fā)成功金額是6288496.75元,說明代發(fā)銀行改動(dòng)了原始數(shù)據(jù),不然應(yīng)代發(fā)金額不會(huì)少0.19元。2.銀行返表的記錄順序已全部打亂,且刪除了備注中注明的分組情況,導(dǎo)致無法統(tǒng)計(jì)到底是哪個(gè)部門哪些人代發(fā)沒有成功,哪個(gè)部門哪些人代發(fā)成功了。3.原表中,有很多相同記錄,即銀行賬號(hào)、姓名、金額、備注都相同,即表的記錄都有可能不是惟一。
現(xiàn)在提出的問題就是,在記錄不能保證惟一的情況下,如何做到原表與銀行返表的記錄一一對(duì)應(yīng)。只有對(duì)應(yīng)成功后,才能可知道銀行代發(fā)成功的數(shù)據(jù)是否都正確,還有哪個(gè)組的哪些人員為什么沒有代發(fā)成功。
如此復(fù)雜的問題,要想在Excel里面解決,將非常困難。筆者試圖通過SQL解決以上問題。
第一步,在Excel表最前加一ID列,然后用1、2、3……等惟一數(shù)據(jù)填充,這樣做的目的是為了將每條記錄惟一化,便于后面進(jìn)行數(shù)據(jù)處理。把修改后的兩表導(dǎo)入Excel數(shù)據(jù)庫ZH中,改名為DK-YB(原表)和DK-YH(銀行返表)(如圖 1)。
第二步,給DK-YB加上兩列“YDID”和“成功”。
第三步,根據(jù)已知條件,假設(shè)我們?cè)贒K-YB中選中一條記錄,如DY-YB.ID=1,那么可以在DK-YH表中找到姓名、賬號(hào)和應(yīng)發(fā)金額一一對(duì)應(yīng)的記錄,但由于有重記錄的存在,需要通過SELECT TOP 1指定惟一的一條記錄來與之對(duì)應(yīng)。當(dāng)兩個(gè)表中都只有惟一記錄在姓名、賬號(hào)和應(yīng)發(fā)金額三項(xiàng)上都一一對(duì)應(yīng)后,我們就可以根據(jù)第一步中設(shè)置的惟一ID來把兩個(gè)表中的數(shù)據(jù)進(jìn)行關(guān)聯(lián),從而達(dá)到解決問題的目的。
基于以上分析,寫出如圖2所示的代碼,通過查詢分析器執(zhí)行。
第四步,執(zhí)行完以上語句,DK-YH表變成了銀行對(duì)原表進(jìn)行了改動(dòng)后的數(shù)據(jù),我們執(zhí)行SELECT * FROM [dkyh] WHERE (成功 = N'o.k.')可以知道銀行代發(fā)成功,但與原始數(shù)據(jù)有差別的38(通過語句SELECT COUNT(*)AS 成功條數(shù) FROM [dk-yh]WHERE (成功 = N'o.k.')查詢得到)條記錄。
第五步,再看DKYB,只要是成功了的,“YDID”和“成功”列就標(biāo)注上了銀行返表的記錄號(hào)ID和O.K.信息;沒有成功的,“YDID”和“成功”列就標(biāo)注上了銀行返表的記錄號(hào)ID和銀行提示的未成功原因;銀行對(duì)原始數(shù)據(jù)進(jìn)行了更改的,“YDID”和“成功”列則都為NULL,通過查詢可知共有3774條。
第六步,將第四步的38條記錄,通過與第五步“YDID”和“成功”列都為NULL的3774條進(jìn)行比對(duì),找出這38條出錯(cuò)的原因,剩下的3736條也是打卡沒有成功的。
第七步,根據(jù)DK-YB表,查詢出符合我們要求的各種數(shù)據(jù),至此,問題解決。
通過以上解決問題的方法,可以發(fā)現(xiàn),對(duì)于復(fù)雜而又棘手的數(shù)據(jù)問題,往往能通過各種程序相互結(jié)合的方法,輕松而迅速地得到解決。當(dāng)然,就本例而言,對(duì)Excel表及SQL數(shù)據(jù)庫等基本知識(shí)的熟悉程度,也決定著我們解決問題的方式和思路。