Excel之PowerQuery 從課程表了解教師任課情況
網(wǎng)友提問,有如下一張課程表

需要從課程表中了解到每位教師都任教于哪些班,哪些課。

一、友情提示:提問中最忌諱的事情
1、數(shù)據(jù)量大:這種情況做完后無法檢查對錯,手工復核太麻煩,盡可能縮小表格行列數(shù)。做到肉眼可見對錯。
2、目標表數(shù)據(jù)錯誤:因為業(yè)務是您自己的,別人能幫您解決計算機的問題,業(yè)務問題您不應該拋給別人。您提供原數(shù)據(jù)表和目標表,那目標表是應該經(jīng)您手工復核的,現(xiàn)在目標表的結果是錯誤的,可能您的意思是說就想要這么一個表,今天這個事我略懂,因為都上過學,如果您所從事的行業(yè)需要指定專業(yè),且非常識性問題,我將愛莫能助。
3、即便是常識問題,具體接觸工作的人也會更了解自己的需求,例如這個問題,誰是主科,誰是副科,數(shù)語英肯定是主科,那音樂、體育怎么算?是與勞動、社團、自習算到一起,還是與數(shù)語英算到一起?這些都沒有說清楚。我們不是商人與消費者的關系,我不可能花大量時間與每個人核對需求。
4、此問題不涉及一位教師講多門主課的情況,例如數(shù)學老師同時教語文,目前只有培訓機構有這種情況,正規(guī)學校教師大多是一人一科,只是稍帶一些社團、自習之類的。我們暫時忽略一個人又教數(shù)學又教語文的情況,且默認班會、社團等全校在同一時間進行。
如果需求進一步升級,那具體問題具體分析。
二、修改表格讓小學生聽懂我想做什么
提問一定要讓小學生聽懂,小學生可以不會做,但是一定要聽懂我在說什么,反之如果小學生聽不懂你在說什么就是你暫時對業(yè)務不理解。例如:曾經(jīng)有位皇帝,他想長生不老,皇帝的表達能力沒問題,可以沒有長生不老藥,但是我們必須要知道自己想做什么,做不出來不可怕,可怕的是不知道怎么表達自己的需求。
現(xiàn)在我們要將這張表:

變成:

三、開始數(shù)據(jù)清洗
如果這個案例不分主副科,不用按年級班級排序,點幾下鼠標一行代碼就搞定了,但是現(xiàn)在加上了這些需求,代碼量就大起來了。
1、導入表格到PowerQuery中

2、選中科目列~轉換~逆透視~逆透視其它列
二維表是打印或觀賞的,我們先將它轉成一維數(shù)據(jù)表

我將其改成如下列名:

3、處理主副科和年級班級排序問題
從提問者的目標表上,我們可以推斷出,排序規(guī)則是:一(1),(2)... 二(1)(2)... 三(1)(2) 且主科與副科分開。

【1】添加列,判斷主副科

【2】搞定排序、年級、班級
(1)添加列,提取年級(漢字)

(2)添加列,提取帶括號的班級

(3)添加列,做排序列

【3】開始套娃
1、按教師姓名分組,第一個組寫課程,第二個組計算課時
課時計算每個人子表的行數(shù)就可以了。

2、大娃是任課情況,我們處理它


現(xiàn)在關系圖是這樣的:最左邊表的每個Table是大娃,中間三張表的每個Table是中娃

我們只需要分析其中任意一組即可:

對中娃按年級分組

修改后的代碼如下:
現(xiàn)在中娃到小娃的關系如下:

我們發(fā)現(xiàn),只需要小娃綠圈中的數(shù)據(jù)拼成字符串即可,有些小娃會牽扯一個排序問題

修改后的代碼:

Text.Combine(List.Distinct(Table.Sort(小娃,"排序")[年級])) & Text.Combine(Table.Sort(小娃,"排序")[班],"、") & Text.Combine(List.Distinct(Table.Sort(小娃,"排序")[科目]),"、")
相當于:?一 & (1)、(2) & 數(shù)學? ?=? 一(1)、(2)數(shù)學

現(xiàn)在我們將小娃變成了這個樣子:

現(xiàn)在只需要取中娃的【數(shù)據(jù)3】這個列,所以Table變List

再取大娃的【數(shù)據(jù)1】列,Table又變List

使用List.Combine將大娃中的列表合并

最后使用Text.Combine對每個大娃中的List轉成Text文件用逗號隔開

上載后的結果:

我們發(fā)現(xiàn)了一個小問題,問題的原因在于我們沒有對帶括號的班級列表去重

我們修改一下:
Text.Combine(List.Distinct(Table.Sort(小娃,"排序")[年級]))?&?Text.Combine(List.Distinct(Table.Sort(小娃,"排序")[班]),"、")?&?Text.Combine(List.Distinct(Table.Sort(小娃,"排序")[科目]),"、")
現(xiàn)在把這段話替換之前的代碼
最終代碼如下:

最終上載后的結果:


PowerQuery合集:https://www.bilibili.com/video/BV1oa4y1j75e
更多教程:https://www.bilibili.com/read/cv10222110