Excel215 | 跨表查詢:查詢指定顧客的購買記錄

今天一位朋友傳來數據表,要求:

根據“購買記錄表”中的記錄,如下:

在“購買查詢”表中實現查詢指定顧客的購買記錄,效果如下:

本問題,有兩個關鍵點:

1、購買記錄必須是依據指定的姓名展示的;

2、購買記錄的序號必須是1、2、3……連續的,且根據查找出的記錄數量改變。

公式實現

實現按指定顧客查詢

在B4單元格輸入公式:

=INDEX(購買記錄表!B:B,SMALL(IF(購買記錄表!$B$2:$B$12=購買查詢!$B$1,ROW(購買記錄表!$B$2:$B$12),ROWS(購買記錄表!B:B)),ROW(A1)))&"",,以三鍵組合結束。

公式向下和向右填充,即得B1單元格指定的顧客的購買記錄。

我們以查找“李四”的購買記錄為例來分析:

第一步:

IF(購買記錄表!$B$2:$B$12=購買查詢!$B$1,ROW(購買記錄表!$B$2:$B$12),ROWS(購買記錄表!B:B))

用IF函數,建立一新的數組,這一新的數組建立的規則是:

如果購買記錄表!$B$2:$B$12區域中的單元格內容等于購買查詢!$B$1單元格內容,則返回該單元格所在的行,否則返回整個工作表的行數。

所以:此部分返回的數組是:

{1048576;1048576;4;1048576;6;1048576;1048576;1048576;1048576;11;1048576;1048576}

可以看到:凡是購買記錄表B列單元格內容等于李四的,返回的都是對應的行數,不等于李四的,返回的都是整個工作表的行數1048576。

第二步:

SMALL(IF(購買記錄表!$B$2:$B$12=購買查詢!$B$1,ROW(購買記錄表!$B$2:$B$12),ROWS(購買記錄表!B:B)),ROW(A1))

在第一步形成的數組中,查找第第一小的數值。

用ROW(A1)做SMALL函數的第二個參數,即第幾小。

ROW(A1)是一個動態的數值,公式往下填充一行,行數加1,即當公式在B4單元格時,是ROW(A1),當公式填充到B5單元格是,是ROW(A2),當到B6單元格時,是ROW(A3)……

這樣,就在第一步的數組中找到了第1、2、3小的值,即4、6、11。

第三步:

INDEX(購買記錄表!B:B,SMALL(IF(購買記錄表!$B$2:$B$12=購買查詢!$B$1,ROW(購買記錄表!$B$2:$B$12),ROWS(購買記錄表!B:B)),ROW(A1)))

當公式在B4單元格時,返回購買記錄表B列第4行的值,即顧客姓名李四。因為公式中IF部分是數組計算,所以公式以三鍵組合結束。

公式向下填充,得到B列購買記錄表B列6、11行的值。

公式向右填充,自動變為查找購買記錄表C列、D列4、6、11行的值。

第四步:

INDEX(購買記錄表!B:B,SMALL(IF(購買記錄表!$B$2:$B$12=購買查詢!$B$1,ROW(購買記錄表!$B$2:$B$12),ROWS(購買記錄表!B:B)),ROW(A1)))&""

在最后加上&"",這一步是容錯處理。用空單元格與空文本合并返回空文本的特性,將超出結果數量的部分不顯示出來。

實現序號自動填充

在A4單元格輸入公式:

=IF(OR($B$1="",B4=""),"",COUNTIF($B$4:B4,$B$1))&""

公式含義是:

如果$B$1姓名為空、或者對應行B列為空,就不填充序號;否則,序號為B列姓名出現的次數。

COUNTIF($B$4:B4,$B$1),是在一隨著行數增加的區域查找B1單元格指定姓名出現的次數。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容